使用 iText 7.1 从 PDF 中删除链接
Remove links from a PDF using iText 7.1
我们有一家供应商不接受包含 links 的 PDF。我们正在尝试通过使用 iText 7.1 (Java) 从 PDF 的每一页中删除所有 link 注释来删除 links。我们根据研究尝试了多种技术。以下是尝试检测和删除 link 的三个示例。 None 导致目标 PDF (test-no-links.pdf) 删除了 link。任何见解将不胜感激。
示例 1:删除基于 class 类型的注释
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();
您的每个测试都会生成一个没有 Link 注释的 PDF。
不过,您的 PDF 查看器可能会将“www.qualpay.com”识别为(部分)URL,并将其显示为 link。
详细
你的日常安排
您的所有测试都已成功从示例 PDF 中删除所有 Link 注释,请参见。这些源文件和所有三个结果文件的屏幕截图,特别是查找第 1 页 Annots 条目:
测试-links.pdf
测试无-links.pdf
测试-无-links-1.pdf
测试-无-links-2.pdf
观众
的确,在 Adobe Acrobat Reader(以及其他一些查看器,例如 Chrome 和 Edge 的内置 PDF 查看器)中查看 PDF 时,您会看到“www.qualpay.com”被视为 link。
原因是这是 PDF 查看器的功能!它扫描它显示的 PDF 文本以查找它识别为某些 URL(的一部分)的字符串,并将它们显示为 links!
在 Adobe Acrobat 中 Reader 您可以禁用此功能:
如果您禁用“从 URLs 创建 links”,您会突然发现结果文件中的 URLs 处于非活动状态,而 URL您的源文件(带有 link 注释)仍然有效。
做什么
We have a vendor that will not accept PDFs that contain links.
首先与您的供应商讨论“包含 links 的 PDF”的确切含义。他的意思是
- PDF 带有 Link 注释 或
- 具有 URL 的 PDF,普通 PDF 查看器 呈现为 Link 注释.
在前一种情况下,您已完成,您的代码(任一变体)删除了 link 注释。不过,您可能需要向供应商演示如何在 Adobe Acrobat Reader 中禁用 URL 识别。
在后一种情况下,您必须从 PDF 的文本内容中删除普通 PDF 查看器识别为 URL 的所有内容。您可以将每个 URL 替换为 URL 文本的位图图像,或像通用矢量图形一样绘制的 URL 文本(定义直线和曲线的路径并填充),或者一些类似的代理人。
我们有一家供应商不接受包含 links 的 PDF。我们正在尝试通过使用 iText 7.1 (Java) 从 PDF 的每一页中删除所有 link 注释来删除 links。我们根据研究尝试了多种技术。以下是尝试检测和删除 link 的三个示例。 None 导致目标 PDF (test-no-links.pdf) 删除了 link。任何见解将不胜感激。
示例 1:删除基于 class 类型的注释
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();
您的每个测试都会生成一个没有 Link 注释的 PDF。
不过,您的 PDF 查看器可能会将“www.qualpay.com”识别为(部分)URL,并将其显示为 link。
详细
你的日常安排
您的所有测试都已成功从示例 PDF 中删除所有 Link 注释,请参见。这些源文件和所有三个结果文件的屏幕截图,特别是查找第 1 页 Annots 条目:
测试-links.pdf
测试无-links.pdf
测试-无-links-1.pdf
测试-无-links-2.pdf
观众
的确,在 Adobe Acrobat Reader(以及其他一些查看器,例如 Chrome 和 Edge 的内置 PDF 查看器)中查看 PDF 时,您会看到“www.qualpay.com”被视为 link。
原因是这是 PDF 查看器的功能!它扫描它显示的 PDF 文本以查找它识别为某些 URL(的一部分)的字符串,并将它们显示为 links!
在 Adobe Acrobat 中 Reader 您可以禁用此功能:
如果您禁用“从 URLs 创建 links”,您会突然发现结果文件中的 URLs 处于非活动状态,而 URL您的源文件(带有 link 注释)仍然有效。
做什么
We have a vendor that will not accept PDFs that contain links.
首先与您的供应商讨论“包含 links 的 PDF”的确切含义。他的意思是
- PDF 带有 Link 注释 或
- 具有 URL 的 PDF,普通 PDF 查看器 呈现为 Link 注释.
在前一种情况下,您已完成,您的代码(任一变体)删除了 link 注释。不过,您可能需要向供应商演示如何在 Adobe Acrobat Reader 中禁用 URL 识别。
在后一种情况下,您必须从 PDF 的文本内容中删除普通 PDF 查看器识别为 URL 的所有内容。您可以将每个 URL 替换为 URL 文本的位图图像,或像通用矢量图形一样绘制的 URL 文本(定义直线和曲线的路径并填充),或者一些类似的代理人。