3

我正在使用带有变音符号的希伯来语 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);
        }
    }
4

1 回答 1

2

您没有展示如何尝试使用 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 文档不存储单词。相反,它存储文本块。在我们的特别篇中,我们使用andIRenderListener表示文本块的开始和结束。在这些文本块中,您会找到文本片段。我们将像这样标记文本片段:其中 x 和 y 值为您提供基线起点的坐标(而不是上升和下降位置)。您还可以获得基线的结束位置(以及上升/下降)。<><text snippet| x=36.0000; y=806.0000>

现在你如何从这一切中提炼出文字?您获得的文本片段的问题在于它们与单词不对应。例如看这个文件:hello_reverse.pdf

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

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

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

这在 mkl 对这个问题的回答中进行了解释:Retrieve the different 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 是一家在美国、比利时和新加坡设有子公司的公司。这是一家拥有许多员工的公司,要让公司保持运转,我们需要赚钱(这就是我们支付员工的方式)。因此,您不应期望我们免费为您提供帮助。您当然可以理解这一点,因为您也不想免费工作,对吗?

于 2015-09-27T12:17:46.477 回答