【问题标题】:Remove hyperlinks from a PDF document (iTextSharp)从 PDF 文档中删除超链接 (iTextSharp)
【发布时间】:2011-08-17 19:58:48
【问题描述】:
我正在尝试利用 iTextSharp(对产品来说非常新)从 PDF 文档中删除超链接。有谁知道这是否可能?我一直在研究 API,但没有找到明显的方法。
我的问题是我正在对一个嵌入了 iframe 的 PDF 的系统进行维护,并且 PDF 中的链接导致用户最终在 iframe 中而不是在新窗口或标签中浏览网站,所以我'正在寻找一种在请求时终止 PDF 中的链接的方法。
提前致谢,
斯科特
【问题讨论】:
标签:
c#
pdf
itextsharp
hyperlink
【解决方案1】:
人们点击的链接是给定页面的 /Annots 数组中的注释。
你有两个选择:
- 销毁整个 /Annots 数组
- 搜索 /Annots 数组并删除所有链接注释
简单爆破注解数组很简单:
PdfDictionary pageDict = reader.getPageN(1); // 1st page is 1
pageDict.remove(PdfName.ANNOTS);
stamper.close();
问题是您可能会破坏您想要保留的注释以及您不想保留的注释。
解决方案是搜索 annot 数组以查找指向 URL 的链接。
PdfDictionary pageDict = reader.getPageN(1);
PdfArray annots = pageDict.getAsArray(PdfName.ANNOTS);
PdfArray newAnnots = new PdfArray();
if (annots != null) {
for (int i = 0; i < annots.size(); ++i) {
PdfDictionary annotDict = annots.getAsDict(i);
if (!PdfName.LINK.equals(annotDict.getAsName(PdfName.SUBTYPE))) {
// annots are actually listed as PdfIndirectReference's.
// Adding the dict directly would be A Bad Thing.
newAnnots.add(annots.get(i));// get the original reference, not the dict
}
}
pageDict.put(PdfName.ANNOTS, newAnnots);
}
这将删除所有链接注释,而不仅仅是那些链接到内部网站的注释。如果您需要更深入地挖掘,您需要查看PDF Spec,第 12.5.6.5 节(链接注释)和第 12.6.4.7 节(URI 操作)。