将链接添加到画布时出现iText错误
我在iText 7中遇到了一个非常奇怪的问题,我希望其他人在过去也处理过这个问题。我基本上只是尝试创建一个目录,将一系列链接对象添加到段落对象中,然后将段落放入画布对象中。下面是一个简化代码示例:将链接添加到画布时出现iText错误,itext,itext7,Itext,Itext7,我在iText 7中遇到了一个非常奇怪的问题,我希望其他人在过去也处理过这个问题。我基本上只是尝试创建一个目录,将一系列链接对象添加到段落对象中,然后将段落放入画布对象中。下面是一个简化代码示例: PdfCanvas pdfCanvas = new PdfCanvas(document.getPdfDocument().addNewPage()); Rectangle rectangle = new Rectangle(36, 650, 100, 100); pdfCan
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();
}
这比您试图实现的目标直观得多。为什么要投反对票?这是一个合理的问题!我想我知道答案,但我需要先测试一下。与此同时,我用一张赞成票取消了反对票。为什么要投反对票?这是一个合理的问题!我想我知道答案,但我需要先测试一下。同时,我以一张赞成票取消了反对票。谢谢你的精彩回复!你不仅帮我解决了我的问题,而且我现在更好地理解了许多基本概念!谢谢你的精彩回复!你不仅帮我解决了我的问题,而且我现在更好地理解了许多基本概念!