【问题标题】:How can I Extract words with its coordinates from pdf using .net?如何使用.net从pdf中提取带有坐标的单词?
【发布时间】:2015-09-26 17:05:18
【问题描述】:

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

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

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

编辑:

PDF小丑代码:

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

【问题讨论】:

  • 由于您没有解释您是如何使用 iTextSharp 或 PDFClown 进行尝试的,因此很难判断您做错了什么。
  • 我添加了pdf小丑的代码。至于itextsharp,我没有代码..但如果你知道怎么做,请告诉我。
  • 那是相当不幸的,毕竟你似乎已经得到了所有的单词,只是没有得到位置,并且添加这并不难。在pdfclown的上下文中,您能否分享一个示例PDF并指出缺少哪些字母?
  • filedropper.com/test23 987654321 @有多个缺失的字母,例如:מאמָטִיקָהלית-ארהיְּסוֹדִי - 为此线路我得到:מָתֵמָטִיקָטִיקָהבֵבֵבֵבֵפֶפֶרהְַּסֹדִ现在举一个词,例如: הַיְּסוֹדִי 我得到: הַ ְּ סֹדִ י
  • 好的,我明天在办公室调查一下。

标签: pdf itextsharp coordinates words pdfclown


【解决方案1】:

您没有展示如何尝试使用 iText(Sharp) 提取文本。我假设您正在关注官方文档,并且您的代码如下所示:

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 中,我们使用&lt;&gt; 指示文本块的开始和结束。在这些文本块中,您会找到文本 sn-ps。我们将像这样标记文本 sn-ps:&lt;text snippet| x=36.0000; y=806.0000&gt; 其中 x 和 y 值为您提供基线起点的坐标(而不是上升和下降位置)。您还可以获得基线的结束位置(以及上升/下降)。

现在,您如何从所有这些中提取文字?你得到的文本 sn-ps 的问题在于它们与单词不对应。例如看这个文件:hello_reverse.pdf

当您在 Adob​​e Reader 中打开它时,您会看到“Hello World Hello People”。您希望在内容流中找到四个单词,不是吗?实际上,您会发现:

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

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

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

我们做过类似的项目。此处描述了其中之一:https://www.youtube.com/watch?v=lZnbhnU4m3Y

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

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

【讨论】:

  • 如果有两个坐标相同的字符\字母怎么办?起始位置相同..
  • 这些字符是否有机会制作连字?另外:每个字符都有诸如“提前”和“边界框”之类的指标。这些指标也可以发挥重要作用。
  • 我想是这样(连字),你为什么要问?边界框是相同的,我无法提交“提前”文件(只是提醒您我正在使用 .net c#)
  • 在使用连字时,正常的做法是将两个不同的字符替换为制作连字的单个字符。例如。将et 替换为&amp;,但有时,通过添加两个重叠的字符来形成连字。无论如何:如果不确切地说出您在说什么,就很难对此发表评论。
  • 我正在尝试从此 pdf filedropper.com/test23 读取所有文本并获取每个单词的坐标。我设法得到了所有字母,但其中一些具有相同的坐标,我无法组合一个单词,因为我不知道将具有相同坐标的字母放在哪里。我找到了这个类:HebrewProcessor 它与我的解决方案有某种关系吗?
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
相关资源
最近更新 更多