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

时间:2011-05-03 15:29:55

标签: c# pdf itextsharp hyperlink

我正在尝试利用iTextSharp(该产品的新功能)从PDF文档中删除超链接。有谁知道这是否可能?我一直在挖掘API并且没有找到明显的方法来做到这一点。

我的问题是我正在对iframe中嵌入了PDF的系统进行维护,而PDF中的链接导致用户最终在iframe中浏览网站,而不是在新窗口或标签中,所以我我正在寻找一种方法在请求时杀死PDF中的链接。

提前致谢, 斯科特

1 个答案:

答案 0 :(得分:4)

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

您有两种选择:

  1. 销毁整个/ Annots数组
  2. 搜索/ Annots数组并删除所有链接注释
  3. 简单地对注释数组进行爆破很简单:

     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操作)。