PDF的超链接检测

时间:2014-04-24 12:21:32

标签: pdf hyperlink adobe itext pdf-extraction

我有一些包含URL和mailto形式的超链接的PDF。现在是否有任何方式或工具(可能是第三方)从PDF中提取超链接元信息,如坐标,链接类型和目标地址。任何帮助都非常感谢。

我已经尝试使用iText和PDFBox但没有取得重大成功,即使是某些第三方软件也没有为我提供所需的输出。

我使用iText在Java中尝试了以下代码

        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);

3 个答案:

答案 0 :(得分:0)

如果你的pdf受到复制保护,你需要从第1步开始,如果他们可以自由复制,你可以从第2步开始

步骤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/

选择&#39; url&#39; as&#39;要提取的地址类型&#39;,选择您的分隔符,点击提取物即可。

希望它能干活。

答案 1 :(得分: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");

答案 2 :(得分:0)

一种可能性是在Acrobat中使用自定义JavaScript,它会枚举&#34;单词&#34;在页面上,然后读出他们的四边形。从中您可以获得坐标以创建链接(或与页面上的链接进行比较),以及实际文本(&#34;单词&#34;。

如果只是&#34;只有&#34;要设置现有链接的边框,还要执行另一个枚举文档链接的Acrobat JavaScript,并设置它们的边框颜色属性(您可能还需要设置宽度)。

(如果您愿意&#34;购买&#34; over&#34; make&#34;请随意与我联系;这些事情是我标准的一部分&#34;曲目&#34;)。< / p>