gpt4 book ai didi

java - 使用 iText 7.1 从 PDF 中删除链接

转载 作者:太空宇宙 更新时间:2023-11-04 10:26:30 25 4
gpt4 key购买 nike

我们有一个供应商不接受包含链接的 PDF。我们尝试使用 iText 7.1 (Java) 从 PDF 的每个页面中删除所有链接注释来删除链接。我们根据研究尝试了多种技术。以下是尝试检测和删除链接的三个示例。这些都不会导致目标 PDF (test-no-links.pdf) 中的链接被删除。任何见解将不胜感激。

示例1:根据注释的类类型删除

  String src  = "test-with-links.pdf";
String dest = "test-no-links.pdf";

PdfReader reader = new PdfReader(src);
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdfDoc = new PdfDocument(reader,writer);

for( int page = 1; page <= pdfDoc.getNumberOfPages(); ++page ) {
PdfPage pdfPage = pdfDoc.getPage(page);
List<PdfAnnotation> annots = pdfPage.getAnnotations();

if ((annots == null) || (annots.size() == 0)) {
System.out.println("no annotations on page " + page);
}
else {
for( PdfAnnotation annot : annots ) {
if( annot instanceof PdfLinkAnnotation ) {
pdfPage.removeAnnotation(annot);
}
}
}
}
pdfDoc.close();

示例 2:根据注释子类型值删除

  String src  = "test-with-links.pdf";
String dest = "test-no-links.pdf";

PdfReader reader = new PdfReader(src);
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdfDoc = new PdfDocument(reader,writer);

for( int page = 1; page <= pdfDoc.getNumberOfPages(); ++page ) {
PdfPage pdfPage = pdfDoc.getPage(page);
List<PdfAnnotation> annots = pdfPage.getAnnotations();

if ((annots == null) || (annots.size() == 0)) {
System.out.println("no annotations on page " + page);
}
else {
for( PdfAnnotation annot : annots ) {
// if this annotation has a link, delete it
if ( annot.getSubtype().equals(PdfName.Link) ) {
PdfDictionary annotAction = ((PdfLinkAnnotation)annot).getAction();

if( annotAction.get(PdfName.S).equals(PdfName.URI) ||
annotAction.get(PdfName.S).equals(PdfName.GoToR) ) {
PdfString uri = annotAction.getAsString(PdfName.URI);
System.out.println("Removing " + uri.toString());
pdfPage.removeAnnotation(annot);
}
}
}
}
}
pdfDoc.close();

示例3:删除所有注释(忽略注释类型)

  String src  = "test-with-links.pdf";
String dest = "test-no-links.pdf";

PdfReader reader = new PdfReader(src);
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdfDoc = new PdfDocument(reader,writer);

for( int page = 1; page <= pdfDoc.getNumberOfPages(); ++page ) {
PdfPage pdfPage = pdfDoc.getPage(page);

// remove all annotations from the page regardless of type
pdfPage.getPdfObject().remove(PdfName.Annots);
}
pdfDoc.close();

最佳答案

您的每个测试都会生成一个没有链接注释的 PDF。

不过,您的 PDF 查看器可能会将“www.qualpay.com”识别为(部分)URL,并将其显示为链接。

详细

你的日常安排

您的所有测试都成功地从示例 PDF 中删除了所有链接注释,参见。这些源文件和所有三个结果文件的屏幕截图,特别是查找第 1 页注释条目:

测试与链接.pdf

test-with-links.pdf

测试无链接.pdf

test-no-links.pdf

测试-no-links-1.pdf

test-no-links-1.pdf

测试-no-links-2.pdf

test-no-links-2.pdf

查看者

事实上,当在 Adob​​e Acrobat Reader(以及其他一些查看器,例如 Chrome 和 Edge 的内置 PDF 查看器)中查看 PDF 时,您会看到“www.qualpay.com”被视为链接。

原因是这是PDF查看器的功能!它会扫描它显示的 PDF 文本,查找它识别为某个 URL(一部分)的字符串,并将它们显示为链接!

在 Adob​​e Acrobat Reader 中,您可以禁用此功能:

Preferences / General

如果禁用“从 URL 创建链接”,您会突然发现结果文件中的 URL 处于非 Activity 状态,而源文件中的 URL(带有链接注释)仍然处于 Activity 状态。

做什么

We have a vendor that will not accept PDFs that contain links.

首先与您的供应商讨论“包含链接的 PDF”的确切含义。他的意思是

  • 带有链接注释的 PDF
  • 带有 URL 的 PDF,常见 PDF 查看器呈现为链接注释

在前一种情况下,您已完成,您的代码(任一变体)都会删除链接注释。不过,您可能必须向供应商演示如何在 Adob​​e Acrobat Reader 中禁用 URL 识别。

在后一种情况下,您必须从 PDF 文本内容中删除普通 PDF 查看器识别为 URL 的所有内容。您可以将每个 URL 替换为 URL 文本的位图图像,或者像通用 vector 图形一样绘制的 URL 文本(定义直线和曲线的路径并填充它),或者一些类似的替代项。

关于java - 使用 iText 7.1 从 PDF 中删除链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50477506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com