2015-11-10 1 views
1

Я собираюсь преобразовать страницу содержимого моего PDF с использованием номеров страниц в качестве гиперссылки на якорь из-за нескольких косвенных ограничений и связь должна быть более динамичной.iTextPDF - Невозможно использовать writeSelectedRows() в таблице, где был вставлен привязку.

Я опустил код внешнего контура, но я пытаюсь создать гиперссылка записи на странице содержимого, используя следующее:

PdfPCell cell = new PdfPCell(); 
Paragraph p = new Paragraph(); 

Anchor anchor = new Anchor("page18 link"); 
anchor.setReference("#page18"); 
p.add(anchor); 
cell.addElement(p); 
table.addCell(cell); 

Когда страница содержания сгенерирована (т.е. всех строк были добавлено), я затем использовать writeSelectedRows на столе:

table.writeSelectedRows(0, -1, PageSize.A4.getWidth()*.05f, PageSize.A4.getHeight()-100, stamper.getOverContent(prevSectionPageCount+currentIndexPage+1)); 

на этом, я получаю следующее исключение:

Причина. Исключение: ошибка в StamperPDFPlugin. нуль java.lang.NullPointerException в com.itextpdf.text.pdf.internal.PdfAnnotationsImp.addPlainAnnotation (PdfAnnotationsImp.java:125) в com.itextpdf.text.pdf.PdfDocument.localGoto (PdfDocument.java:2115) на com.itextpdf.text.pdf.PdfDocument.writeLineToContent (PdfDocument.java:1612) на com.itextpdf.text.pdf.ColumnText.go (ColumnText.java:1025) на com.itextpdf.text.pdf. ColumnText.go (ColumnText.java:877) в com.itextpdf.text.pdf.ColumnText.goComposite (ColumnText.java:1381) в com.itextpdf.text.pdf.ColumnText.go (ColumnText.java:882) на com.itextpdf.text.pdf.ColumnText.go (ColumnText.java:877) в com.itextpdf.text.pdf.ColumnText.go (ColumnText. Java: 866) на com.itextpdf.text.pdf.PdfPRow.writeCells (PdfPRow.java:549) на com.itextpdf.text.pdf.PdfPTable.writeSelectedRows (PdfPTable.java:767) на com.itextpdf .text.pdf.PdfPTable.writeSelectedRows (PdfPTable.java:897) на com.itextpdf.text.pdf.PdfPTable.writeSelectedRows (PdfPTable.java:845) на com.itextpdf.text.pdf.PdfPTable.writeSelectedRows (PdfPTable.java:823) на com.ems.rendition.cts.plugin.StamperPDFPlugin.transform (StamperPDFPlugin.java:584) на com.ems.rendition.cts.plugin.StamperPDFPlugin.transform (StamperPDFPlugin.java : 328) по адресу com.ems .rendition.cts.plugin.StamperPDFPlugin.executeProfile (StamperPDFPlugin.java:171)

Увидев запись трассировки стека для localGoto, я вынул линию anchor.setReference("#18.pdf"); и завершается нормально без ошибок (но, очевидно, с отсутствием гиперссылок - только обычный текст).

Что здесь общего не работает? Я добавляю якорь в ячейку неправильно?

Благодаря

+0

Я пробовал это в iText 5.5.7, и я не мог воспроизвести проблему. Какую версию вы используете? –

+0

Спасибо @BrunoLowagie - я использую 5.4.5. Я только что обновил свой проект, чтобы захватить 5.5.7 из репозитория. Я повторю проверку с использованием этой версии – Smittey

+1

Я только что опубликовал пример, который я использовал для тестирования. –

ответ

1

Пожалуйста, обратите внимание на LinkInPositionedTable:

public void createPdf(String dest) throws IOException, DocumentException { 
    Document document = new Document(); 
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest)); 
    document.open(); 
    Anchor target = new Anchor("top"); 
    target.setName("page18"); 
    document.add(target); 
    PdfPTable table = new PdfPTable(1); 
    table.setTotalWidth(500); 
    PdfPCell cell = new PdfPCell(); 
    Paragraph p = new Paragraph(); 
    Anchor anchor = new Anchor("page18 link"); 
    anchor.setReference("#page18"); 
    p.add(anchor); 
    cell.addElement(p); 
    table.addCell(cell); 
    table.writeSelectedRows(0, -1, 36, 700, writer.getDirectContent()); 
    document.close(); 
} 

В этом примере, я создать якорь с именем page18 (хотя это просто относится к верхней части страницы) и ссылки на этот якорь добавлен в PdfPTable, используя фрагмент кода.

Вы можете найти результат здесь: link_in_positioned_table.pdf

Это работает для меня, при использовании IText 5.5.7 (который является самой последней версии).

+0

Спасибо за образец кода, Бруно. Я обновил проект, чтобы использовать v.5.5.7, проверил ваш код локально и работал (он также работал локально с v.5.4.5). Затем я пошел, чтобы проверить сборку проекта, чтобы найти, что ошибка все еще существует. Кажется, что проблема только в том случае, когда включен параметр setRefference() ', который является причудливым, поскольку структура такая же, как и выше! Есть ли у вас какие-либо идеи, что может вызвать это? Я собираюсь попытаться создать его из открытой структуры, чтобы попытаться определить, в чем проблема. – Smittey

+0

Из-за того, что он отключен, кажется, что аргумент canvas 'writeSelectedRows()' является тем, что вызывает проблему. Единственное отличие между примером и нашим решением заключается в использовании 'stamper.getOverContent()' в отличие от 'writer.getDirectContent()'. – Smittey

+0

Привет, Бруно, определенно проблема с 'writeSelectedRows()', содержащая локальные привязки, использующие '.getOverContent()' как 'canvas'. Возможно, я что-то делаю неправильно, но это не похоже на это. Я поставил новый вопрос в StackOverflow для ясности. – Smittey

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