您没有展示如何尝试使用 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
当您在 Adobe 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 是一家在美国、比利时和新加坡设有子公司的公司。这是一家拥有许多员工的公司,要让公司保持运转,我们需要赚钱(这就是我们支付员工的方式)。因此,您不应期望我们免费为您提供帮助。您当然可以理解这一点,因为您也不想免费工作,对吗?