我正在使用带有变音符号的希伯来语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);
}
}
答案 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是一家在美国,比利时和新加坡设有子公司的公司。这是一家拥有众多员工的公司,为了让公司保持运营,我们需要赚钱(这就是我们如何向员工付款)。因此,您不应期望我们免费为您提供帮助。当然,你可以理解这一点,因为你也不想免费工作,是吗?