2016-08-08 2 views
1

Я столкнулся с довольно странной проблемой в iText 7, о которой я надеюсь, что другие люди раньше имели дело. Я просто пытаюсь создать оглавление, добавив ряд объектов Link в объект Paragraph, а затем отбросив Paragraph в объект Canvas. Вот пример упрощенного кода:Ошибка iText при добавлении ссылки на холст

PdfCanvas pdfCanvas = new PdfCanvas(document.getPdfDocument().addNewPage()); 
    Rectangle rectangle = new Rectangle(36, 650, 100, 100); 
    pdfCanvas.rectangle(rectangle); 
    pdfCanvas.stroke(); 
    Canvas canvas = new Canvas(pdfCanvas, document.getPdfDocument(), rectangle); 
    canvas.add(new Paragraph(new Link("Google", PdfAction.createGoToR("HELLO", "www.google.com")))); 

Как вы можете видеть, это довольно голые кости. Однако, когда я это делаю, я получаю исключение с нулевым указателем. Я могу добавить простой текст без каких-либо проблем, но в тот момент, когда я добавляю ссылку, все становится неловко. Любая помощь будет очень оценена.

+0

Почему проголосовали? Это законный вопрос! Я думаю, что знаю ответ, но сначала мне нужно его проверить. (В то же время я «расстегнул» проголосовавший по голосу.) –

ответ

4

Это, как вы могли бы нарисовать прямоугольник (или в данном случае, квадрат) на PdfCanvas:

PdfDocument pdf = new PdfDocument(new PdfWriter(dest)); 
PdfPage page = pdf.addNewPage(); 
PdfCanvas pdfCanvas = new PdfCanvas(page); 
Rectangle rectangle = new Rectangle(36, 650, 100, 100); 
pdfCanvas.rectangle(rectangle); 
pdfCanvas.stroke(); 
pdf.close(); 

Вам не нужен Document объект. Вы просто создаете PdfCanvas и рисуете прямоугольную форму с нижним левым углом x = 36; y = 360, измеряя 100 на 100 единиц.

Вы вводите объект Document, так как вы также хотите создать Link. Это тоже не обязательно. Вы можете попробовать это (но это было бы неправильно):

Canvas canvas = new Canvas(pdfCanvas, pdf, rectangle); 
canvas.add(new Paragraph().add("Google")); 
canvas.add(new Paragraph(new Link("Google", PdfAction.createGoToR("HELLO", "www.google.com")))); 
pdf.close(); 

Как вы можете видеть, мы работаем с pdfPdfDocument) и pdf в одиночку. В нем нет Document. Однако вы пытаетесь добавить ссылку на объект Canvas. A Canvas может использоваться, если вы хотите добавить синтаксис PDF в поток контента . Ссылка не является частью потока контента. Ссылка представляет собой аннотацию, которая хранится в записи /Annots словаря страницы. Короче: вы используете Canvas за то, что он не может быть использован.

Я думаю, вы пытаетесь установить ссылку в абсолютном положении и хотите поместить прямоугольник вокруг этой ссылки. Это не делается с использованием Canvas. Это намного проще, если вы просто положили Paragraph в абсолютное положение.

Например:

public void createPdf(String dest) throws IOException { 
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest)); 
    Document document = new Document(pdf); 
    Paragraph p = new Paragraph() 
     .add(new Link("Google", PdfAction.createGoToR("HELLO", "www.google.com"))) 
     .setFixedPosition(36, 650, 80) 
     .setBorder(new SolidBorder(0.5f)); 
    document.add(p); 
    document.close(); 
} 

Это добавить Paragraph в положении (x = 36; y = 650) и шириной 80 единиц пользователя. Добавим 0,5-кратную границу вокруг Paragraph.

Это тоже не сработает, потому что ссылка неверна. Вы используете действие GoToR (перейти к удаленному), которое предназначено для перехода к конкретному пункту назначения в другом PDF-файле. Я думаю, что вы хотите, действие URI вместо:

public void createPdf(String dest) throws IOException { 
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest)); 
    Document document = new Document(pdf); 
    Paragraph p = new Paragraph() 
     .add(new Link("Google", PdfAction.createURI("www.google.com"))) 
     .setFixedPosition(36, 650, 80) 
     .setBorder(new SolidBorder(0.5f)); 
    document.add(p); 
    document.close(); 
} 

Если вы хотите получить больше пространства вокруг текста, вы можете изменить отступы:

public void createPdf(String dest) throws IOException { 
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest)); 
    Document document = new Document(pdf); 
    Paragraph p = new Paragraph() 
     .add(new Link("Google", PdfAction.createURI("www.google.com"))) 
     .setFixedPosition(36, 650, 80) 
     .setPadding(10) 
     .setBorder(new SolidBorder(0.5f)); 
    document.add(p); 
    document.close(); 
} 

Это гораздо более интуитивным, чем то, что вы пытались достигать.

+0

Спасибо, за фантастический ответ!Вы не только помогли мне с моей проблемой, но теперь я понимаю многие базовые концепции! –

Смежные вопросы