由于一些环境上的限制,我正在将PDF的内容页面从使用页码作为超链接转换为锚点,并且链接需要更加动态。
我省略了外循环代码,但是我尝试使用以下内容在内容页面中创建超链接条目:
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");
行,它完成得很好,没有错误(但是显然没有超链接-仅是纯文本)。这是怎么了?我是否将锚点错误地添加到单元格?
谢谢
最佳答案
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(最新版本)时,这对我有用。