【问题标题】:iText error when adding Link onto Canvas将链接添加到画布时出现 iText 错误
【发布时间】:2016-08-08 16:16:50
【问题描述】:

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

如您所见,这是非常简单的。但是,当我这样做时,我得到一个空指针异常。我可以毫无问题地添加简单的文本,但是在我添加链接的那一刻,事情就变得混乱了。任何帮助将不胜感激。

【问题讨论】:

  • 为什么投反对票?这是一个合法的问题!我想我知道答案,但我需要先测试一下。 (与此同时,我用赞成票“撤消”了反对票。)

标签: itext itext7


【解决方案1】:

这就是您可以在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 x 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 对象的链接。如果您想将 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();
}

这会在(x = 36; y = 650) 位置添加一个Paragraph,宽度为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();
}

这比您尝试实现的要直观得多。

【讨论】:

  • 感谢您的精彩回复!你不仅帮我解决了我的问题,而且我现在更好地理解了很多基本概念!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
相关资源
最近更新 更多