将链接添加到画布时出现iText错误

时间:2016-08-08 16:16:51

标签: itext itext7

我在iText 7中遇到了一个非常奇怪的问题,我希望其他人在过去处理过这个问题。我基本上只是尝试通过将一系列Link对象添加到Paragraph对象中,然后将Paragraph放入Canvas对象来创建目录。这是简化代码的示例:

    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"))));

正如你所看到的,这是相当不容易的。但是,当我这样做时,我得到一个空指针异常。我可以添加简单的文本而不会有任何问题,但是当我添加链接时,事情就会变得混乱。非常感谢任何帮助。

1 个答案:

答案 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();

如您所见,我们仅使用pdf(一个PdfDocument)和pdf。没有涉及Document。但是,您尝试添加指向Canvas对象的链接。如果要将PDF语法添加到内容流,可以使用Canvas。链接不是内容流的一部分。链接是存储在页面字典的/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个用户单位。我们在Paragraph周围添加了0.5个粗边框。

这也不起作用,因为链接都是错误的。您正在使用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();
}

这比你想要达到的要简单得多。