从PDF文档中删除超链接(iTextSharp)

本文关键字:iTextSharp 超链接 删除 PDF 文档 | 更新日期: 2023-09-27 17:54:42

我正在尝试利用iTextSharp(非常新的产品)从PDF文档中删除超链接。有人知道这是可能的吗?我一直在研究API,但还没有找到一个明显的方法来做到这一点。

我的问题是,我正在做一个系统的维护,在iframe内嵌入PDF和PDF内的链接导致用户最终在iframe内浏览网站,而不是在一个新的窗口或选项卡中,所以我正在寻找一种方法来杀死PDF中的链接在请求时间

提前感谢,斯科特

从PDF文档中删除超链接(iTextSharp)

人们点击的链接是给定页面/annotation数组中的注释。

你有两个选择:

  1. 销毁整个/Annots数组
  2. 查找/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规范,第12.5.6.5节(链接注释)和第12.6.4.7节(URI操作)。

使用PDFSharp你可以这样做:

  void RemoveHyperlinks (string sourcePDF, string targetPDF) {
            using (PdfDocument PDFDoc = PdfReader.Open (sourcePDF, PdfDocumentOpenMode.Import)) {
                using (PdfDocument PDFNewDoc = new PdfDocument ()) {
                    // Copy pages to new doc
                    for (int Pg = 0; Pg < PDFDoc.Pages.Count; Pg++) {
                        PdfPage page = PDFDoc.Pages[Pg];
                        //page.HasAnnotations
                        page.Annotations.Clear();
                        var newPage = PDFNewDoc.AddPage(page);
                    } // for
                    PDFNewDoc.Save (targetPDF);
                } // using 
            } // using 
        }
    }