2014-04-24 71 views
0

我有一些包含URL和mailto形式的超链接的PDF。现在是否有任何方式或工具(可能是第三方)从PDF中提取超链接元信息,如坐标,链接类型和目标地址。任何帮助,高度赞赏。来自PDF的超链接检测

我已经尝试使用iText和PDFBox,但没有大的成功,甚至有些第三方软件也不能提供我想要的输出。

我曾尝试利用iText

 PdfReader myReader = new PdfReader("pdf File Path"); 
     PdfDictionary pageDict = myReader.getPageN(1); 
     PdfArray annots = pageDict.getAsArray(PdfName.ANNOTS); 
     System.out.println(annots); 
     ArrayList<String> dests = new ArrayList<String>(); 
     if(annots != null) 
     { 
      for(int i=0; i<annots.size(); ++i) 
      { 
       PdfDictionary annotDict = annots.getAsDict(i); 
       PdfName subType = annotDict.getAsName(PdfName.SUBTYPE); 
       if (subType != null && PdfName.LINK.equals(subType)) 
       { 
        PdfDictionary action = annotDict.getAsDict(PdfName.A); 
        if(action != null && PdfName.URI.equals(action.getAsName(PdfName.S))) 
        { 
         dests.add(action.getAsString(PdfName.URI).toString()); 
        } // else { its an internal link } 
       } 
      } 
     }   
     System.out.println(dests); 
+1

@ Bobrovsky答案中的示例使用Doxotic搜索链接注释,并使用iText搜索链接注释或PDFBox将被类似地设计您确定文档中的链接确实是链接注释吗?例如。 Adobe Reader有一个选项,它使内容中的地址可点击,就好像它们是链接注释,而不是。也许这样的功能让你相信有链接注释,而实际上并没有。 (顺便说一句,你可能想提供你尝试过的代码;也许这是错误的)。 – mkl

+0

非常感谢你已经完成了它。其实我的代码工作正常,它是Adobe创建悬停链接的财产。您能否为我提供Adobe创建此类媒体资源的规范以便我可以检查它 –

+1

Adob​​e Reader只是在页面内容中搜索它认为是URL的内容并使它们互动。您可以在首选项中打开或关闭此行为。我不知道哪些* specs *提供。 – mkl

回答

0

您可以使用Docotic.Pdf library进行链接提取(免责声明:我为公司工作)。

下面是打开指定文件,查找所有超链接,收集有关每个链接位置的信息并在每个链接周围绘制矩形的代码。

之后,代码将创建新的PDF(带有矩形链接)和带有收集信息的文本文件。最后,这两个创建的文件都在默认查看器中打开。

public static void ListAndHighlightLinks(string inputFile, string outputFile, string outputTxt) 
{ 
    using (PdfDocument doc = new PdfDocument(inputFile)) 
    { 
     StringBuilder sb = new StringBuilder(); 

     for (int i = 0; i < doc.Pages.Count; i++) 
     { 
      PdfPage page = doc.Pages[i]; 
      foreach (PdfWidget widget in page.Widgets) 
      { 
       PdfActionArea actionArea = widget as PdfActionArea; 
       if (actionArea == null) 
        continue; 

       PdfUriAction linkAction = actionArea.Action as PdfUriAction; 
       if (linkAction == null) 
        continue; 

       Uri url = linkAction.Uri; 
       PdfRectangle rect = actionArea.BoundingBox; 

       // add information about found link into string buffer 
       sb.Append("Page "); 
       sb.Append(i.ToString()); 
       sb.Append(" : "); 
       sb.Append(rect.ToString()); 
       sb.Append(" "); 
       sb.AppendLine(url.ToString()); 

       // draw rectangle around found link 
       page.Canvas.DrawRectangle(rect); 
      } 
     } 

     // save document with highlighted links and text information about links to files 
     doc.Save(outputFile); 
     System.IO.File.WriteAllText(outputTxt, sb.ToString()); 

     // open created PDF and text file in default viewers 
     System.Diagnostics.Process.Start(outputTxt); 
     System.Diagnostics.Process.Start(outputFile); 
    } 
} 

您可以使用示例代码,像这样的电话:

ListAndHighlightLinks("input.pdf", "output.pdf", "links.txt"); 
0

,如果你的PDF文件被复制保护,你需要开始与步骤1中,如果他们可以自由地复制,您可以用第2步开始在Java中下面的代码

第1步:将您的PDF文档到Word的.doc:使用Adobe Acrobat Pro或在线PDF到Word转换器:

http://www.pdfonline.com/pdf2word/index.asp 

第2步:在这里复制粘贴整个文件到输入窗口,您也可以下载HTML轻量级工具:

http://www.surf7.net/services/value-added-services/free-web-tools/email-extractor-lite/ 

选择“网址”为“地址的方法来提取”,选择您的分隔符,打提取物,仅此而已。

希望它的作品欢呼声。

+0

我曾尝试过Acrobat Pro,但在某些情况下它只是无法做到这一点。但是,如何在x和y方面捕获超链接吸收在PDF中的坐标。 –

0

一种可能是在Acrobat中使用自定义JavaScript,这将枚举“单词”网页上,然后阅读他们的四边形。从这里你可以获得创建链接的坐标(或者与网页上的链接进行比较)以及实际文本(即“单词”)

如果是“仅”设置现有链接的边框,还可以使用另一个Acrobat JavaScript枚举文档的链接,并设置其边框颜色属性(并且您可能还需要设置宽度)

(如果您更喜欢“购买“over”使“随意与我私密联系;这些东西是我标准”剧目“的一部分)