如何使用.net从pdf中提取带有坐标的单词?

时间:2015-09-26 17:05:18

标签: pdf itextsharp coordinates words pdfclown

我正在使用带有变音符号的希伯来语pdf。我想用它的坐标提取所有单词。我试图使用ITextSharp和pdfClown,他们都没有给我我想要的东西。

在pdfClown中,ITextSharp中缺少字母\字符我没有得到单词坐标。

有办法吗? (我正在寻找一个免费的框架\代码)

编辑:

PDFClown Code:

    File file = new File(PDFFilePath);
    TextExtractor te = new TextExtractor();
    IDictionary<RectangleF?, IList<ITextString>> strs = te.Extract(file.Document.Pages[0].Contents);

    List<string> correctText = new List<string>();
    foreach (var key in strs.Keys)
    {
        foreach (var value in strs[key])
        {
            string reversedText = new string(value.Text.Reverse().ToArray());
            string cleanText = RemoveDiacritics(reversedText);
            correctText.Add(cleanText);
        }
    }

1 个答案:

答案 0 :(得分:2)

您没有展示如何使用iText(夏普)提取文字。我假设您正在遵循官方文档,并且您的代码如下所示:

public string ExtractText(byte[] src) {
    PdfReader reader = new PdfReader(src);
    MyTextRenderListener listener = new MyTextRenderListener();
    PdfContentStreamProcessor processor = new PdfContentStreamProcessor(listener);
    PdfDictionary pageDic = reader.GetPageN(1);
    PdfDictionary resourcesDic = pageDic.GetAsDict(PdfName.RESOURCES);
    processor.ProcessContent(
       ContentByteUtils.GetContentBytesForPage(reader, 1), resourcesDic);
    return listener.Text.ToString();
}

如果你的代码看起来不像这样,那么这个解释已经解释了你做错的第一件事。

在这种方法中,有一个类不属于iTextSharp:MyTextRenderListener。这是应编写的类,它看起来像这样:

public class MyTextRenderListener : IRenderListener {
    public StringBuilder Text { get; set; }

    public MyTextRenderListener() {
        Text = new StringBuilder();
    }
    public void BeginTextBlock() {
        Text.Append("<");
    }
    public void EndTextBlock() {
        Text.AppendLine(">");
    }
    public void RenderImage(ImageRenderInfo renderInfo) {
    }
    public void RenderText(TextRenderInfo renderInfo) {
        Text.Append("<");
        Text.Append(renderInfo.GetText());
        LineSegment segment = renderInfo.GetBaseline();
        Vector start = segment.GetStartPoint();
        Text.Append("| x=");
        Text.Append(start[Vector.I1]);
        Text.Append("; y=");
        Text.Append(start[Vector.I2]);
        Text.Append(">");
    }    
}

当您运行此代码,并查看Text中的内容时,您会注意到PDF文档无法存储文字。相反,它存储文本块。在我们的特殊IRenderListener中,我们使用<>指示文本块的开头和结尾。在这些文本块中,您可以找到文本片段。我们将这样的文本片段标记为:<text snippet| x=36.0000; y=806.0000>,其中x和y值为您提供基线开始的坐标(与上升和下降位置相对)。您还可以获得基线的最终位置(以及上升/下降)。

现在你如何从这一切中提炼出来的话?你得到的文本片段的问题在于它们与单词不对应。例如,请参阅此文件:hello_reverse.pdf

当您在Adobe Reader中打开它时,您会阅读&#34; Hello World Hello People。&#34;你希望你在内容流中找到四个单词,不是吗?实际上,这就是你会发现的:

<>
<<ld><Wor><llo><He>>
<<Hello People>>

提炼出来的话,&#34; World&#34;和#34;您好&#34;从第一行开始,你需要做大量的数学运算。您必须使用TextRenderInfo方法,而不是获取渲染侦听器的RenderText()方法中返回的GetCharacterRenderInfos()对象的基线。这将返回TextRenderInfo个对象的列表,为您提供有关每个字符(包括这些字符的位置)的更多信息。然后,您需要从这些不同的字符组成单词。

这在mkl对这个问题的回答中有解释:Retrieve the respective coordinates of all words on the page with itextsharp

我们做过类似的项目。其中一个描述如下:https://www.youtube.com/watch?v=lZnbhnU4m3Y

您需要做一些编码才能做到正确。关于PdfClown的一句话:您的文本可能在PDF中存储为UNICODE。要检索正确的字符,解析器需要检查存储在字体中的字形和相应的UNICODE字符的映射。如果PdfClown不能这样做,这意味着PdfClown不能正确地完成这项任务。 PdfClown是一个单人项目,所以你必须要求开发人员解决这个问题(如果他有时间)。

从视频中可以看出,iText可以帮助您,但iText是一家在美国,比利时和新加坡设有子公司的公司。这是一家拥有众多员工的公司,为了让公司保持运营,我们需要赚钱(这就是我们如何向员工付款)。因此,您不应期望我们免费为您提供帮助。当然,你可以理解这一点,因为你也不想免费工作,是吗?