如何从pdf文件“C#”中使用AnchorText读取超链接

时间:2012-04-06 15:24:32

标签: c# itextsharp

i have taken the link values from pdf file like (http://google.com)

但我需要取锚文本值,例如点击此处 如何取锚链接值文本.. 我使用下面的url获取pdf文件的url值。 Reading hyperlinks from pdf file 例如。

Anchor a = new Anchor("Test Anchor");
a.Reference = "http://www.google.com";
myParagraph.Add(a);

这里我得到http://www.google.com,但我需要得到锚值,即测试锚 需要你的建议..

问候 庵埠

2 个答案:

答案 0 :(得分:4)

从PDF文件中,您需要确定放置链接的区域,然后使用iTextSharp阅读链接下方的文本。

通过这种方式,您可以提取链接下方的文本。这种方法的局限性在于,如果链接区域比文本宽,则提取将读取该区域下的全文。

private void GetAllHyperlinksFromPDFDocument(string pdfFilePath)
{
    string linkTextBuilder = "";
    string linkReferenceBuilder = "";

    PdfDictionary PageDictionary = default(PdfDictionary);
    PdfArray Annots = default(PdfArray);
    PdfReader R = new PdfReader(pdfFilePath);

    List<BinaryHyperlink> ret = new List<BinaryHyperlink>();

    //Loop through each page
    for (int i = 1; i <= R.NumberOfPages; i++)
    {
        //Get the current page
        PageDictionary = R.GetPageN(i);

        //Get all of the annotations for the current page
        Annots = PageDictionary.GetAsArray(PdfName.ANNOTS);

        //Make sure we have something
        if ((Annots == null) || (Annots.Length == 0))
            continue;

        //Loop through each annotation

        foreach (PdfObject A in Annots.ArrayList)
        {
            //Convert the itext-specific object as a generic PDF object
            PdfDictionary AnnotationDictionary = (PdfDictionary)PdfReader.GetPdfObject(A);

            //Make sure this annotation has a link
            if (!AnnotationDictionary.Get(PdfName.SUBTYPE).Equals(PdfName.LINK))
                continue;

            //Make sure this annotation has an ACTION
            if (AnnotationDictionary.Get(PdfName.A) == null)
                continue;

            //Get the ACTION for the current annotation
            PdfDictionary AnnotationAction = (PdfDictionary)AnnotationDictionary.GetAsDict(PdfName.A);
            if (AnnotationAction.Get(PdfName.S).Equals(PdfName.URI))
            {
                //Get action link URL : linkReferenceBuilder
                PdfString Link = AnnotationAction.GetAsString(PdfName.URI);
                if (Link != null)
                    linkReferenceBuilder = Link.ToString();

                //Get action link text : linkTextBuilder
                var LinkLocation = AnnotationDictionary.GetAsArray(PdfName.RECT);
                List<string> linestringlist = new List<string>();
                iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(((PdfNumber)LinkLocation[0]).FloatValue, ((PdfNumber)LinkLocation[1]).FloatValue, ((PdfNumber)LinkLocation[2]).FloatValue, ((PdfNumber)LinkLocation[3]).FloatValue);
                RenderFilter[] renderFilter = new RenderFilter[1];
                renderFilter[0] = new RegionTextRenderFilter(rect);
                ITextExtractionStrategy textExtractionStrategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), renderFilter);
                linkTextBuilder = PdfTextExtractor.GetTextFromPage(R, i, textExtractionStrategy).Trim();
            }
        }
    }
}

答案 1 :(得分:0)

不幸的是,我不认为你能做到这一点,至少在没有大量猜测的情况下。在HTML中,这很容易,因为超链接及其文本一起存储为:

<a href="http://www.example.com/">Click here</a>

但是,在PDF中,这两个实体不会以任何形式的关系存储。我们认为PDF中的“超链接”在技术上是一个恰好位于文本顶部的PDF注释。您可以通过在Adobe Acrobat Pro等编辑程序中打开PDF来查看。您可以更改文本,但“可点击”区域不会更改。您还可以移动“可点击”区域并调整其大小,并将其放在文档中的任何位置。

创建PDF时,iText / iTextSharp会将其抽象出来,因此您无需考虑这一点。您可以创建一个带有可点击文本的“超链接”,但是当它生成PDF时,它最终会将文本创建为普通文本,计算矩形坐标,然后在该矩形上添加注释。

我确实说过你可以尝试猜测一下,它可能会或可能不适合你。要做到这一点,您需要获取注释的矩形,然后找到也在这些坐标处的文本。但是,由于填充问题,它不会完全匹配。如果你绝对必须在超链接下获取文本,那么这是我知道这样做的唯一方法。祝你好运!