iTextPDF - 不能在已插入锚点的表上使用writeSelectedRows()

时间:2015-11-10 15:19:34

标签: java itext itextpdf

我正在将我的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 at   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)at   com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:877)at at   com.itextpdf.text.pdf.ColumnText.goComposite(ColumnText.java:1381)at   com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:882)at at   com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:877)at at   com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:866)at at   com.itextpdf.text.pdf.PdfPRow.writeCells(PdfPRow.java:549)at at   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");并且它没有错误就完成了(但显然没有超链接 - 只有纯文本)。

这里出了什么问题?我是否错误地将锚点添加到单元格中?

由于

1 个答案:

答案 0 :(得分: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的锚点的引用。< / p>

您可以在此处找到结果:link_in_positioned_table.pdf

当使用iText 5.5.7(这是最新版本)时,这对我有用。