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

将链接添加到画布时出现iText错误,itext,itext7,Itext,Itext7,我在iText 7中遇到了一个非常奇怪的问题,我希望其他人在过去也处理过这个问题。我基本上只是尝试创建一个目录,将一系列链接对象添加到段落对象中,然后将段落放入画布对象中。下面是一个简化代码示例: PdfCanvas pdfCanvas = new PdfCanvas(document.getPdfDocument().addNewPage()); Rectangle rectangle = new Rectangle(36, 650, 100, 100); pdfCan

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

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

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

这是您在PdfCanvas上绘制矩形或正方形的方法:

您不需要文档对象。您只需创建一个PdfCanvas,然后绘制一个矩形形状,左下角x=36;y=360,测量100×100用户单位

您引入了一个文档对象,因为您还想创建一个链接。那也没必要。你可以试试这个,但那是错误的:

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、pdf文档和单独的pdf。没有涉及任何文件。但是,您正在尝试添加指向画布对象的链接。如果要向内容流添加PDF语法,可以使用画布。链接不是内容流的一部分。链接是存储在页面字典的/Annots条目中的注释。简言之:您正在使用Canvas来完成它无法使用的任务

我认为你想把一个链接放在一个绝对位置,你想在这个链接周围放一个矩形。这不是使用画布完成的。如果你只是把一个段落放在一个绝对的位置,那就容易多了

例如:

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,宽度为80个用户单位。我们在段落周围添加了0.5厚的边框

这也行不通,因为链接都错了。您正在使用GoToR go to远程操作,该操作旨在转到另一个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();
}

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

这是您如何在PdfCanvas上绘制矩形或在本例中绘制正方形的方法:

您不需要文档对象。您只需创建一个PdfCanvas,然后绘制一个矩形形状,左下角x=36;y=360,测量100×100用户单位

您引入了一个文档对象,因为您还想创建一个链接。那也没必要。你可以试试这个,但那是错误的:

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、pdf文档和单独的pdf。没有涉及任何文件。但是,您正在尝试添加指向画布对象的链接。如果要向内容流添加PDF语法,可以使用画布。链接不是内容流的一部分。链接是存储在页面字典的/Annots条目中的注释。简言之:您正在使用Canvas来完成它无法使用的任务

我认为你想把一个链接放在一个绝对位置,你想在这个链接周围放一个矩形。这不是使用画布完成的。如果你只是把一个段落放在一个绝对的位置,那就容易多了

例如:

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,宽度为80个用户单位。我们在段落周围添加了0.5厚的边框

这也行不通,因为链接都错了。您正在使用GoToR go to远程操作,该操作旨在转到另一个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();
}

这比您试图实现的目标直观得多。

为什么要投反对票?这是一个合理的问题!我想我知道答案,但我需要先测试一下。与此同时,我用一张赞成票取消了反对票。为什么要投反对票?这是一个合理的问题!我想我知道答案,但我需要先测试一下。同时,我以一张赞成票取消了反对票。谢谢你的精彩回复!你不仅帮我解决了我的问题,而且我现在更好地理解了许多基本概念!谢谢你的精彩回复!你不仅帮我解决了我的问题,而且我现在更好地理解了许多基本概念!