我正在使用iTextSharp
从PDF文件中提取一些信息。一切都近乎完美(事实上印象深刻),我只是有些问题。
例如,在PDF中,我有以下句子:
Dèslafindesoirée,[...]
当我查看PDF时,我确切地看到了这一点,但是当我收到以下代码中的文本时:
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
for (int page = 1; page <= pdfReader.NumberOfPages; page++)
{
string currentPageText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
if (currentPageText.Contains(PAGE_MARKER))
{
return currentPageText;
}
}
有问题的文字如下:
Dèslafi ndesoirée,[...]
这很奇怪,但“fi”实际上只有一个角色,并且有一个空格。
当我在Foxit阅读器或Adobe acrobat中打开相同的PDF时,它看起来很好,但如果我复制粘贴文本,我会有以下文字:
Dèslafi ndesoirée,[...] (所以正确的字符,但有一个空格)
这是一个例子,但我还有一些例子。
知道如何解决这个问题吗?
答案 0 :(得分:0)
为了理所当然,你需要一些pdf语法的背景知识。
在最基本的形式中,pdf文档仅包含在查看器中呈现文档所需的指令。换句话说,没有呈现“文本”的概念。就像“在位置150,877处画出角色'A”等等。
实际上,这是来自.pdf文档的片段(使用简单的文本编辑器打开)
[a, -28.7356, p, 27.2652, p, 27.2652, e, -27.2652, a, -28.7356, r, 64.6889, a, -28.7356, n, 27.2652, c, -38.7594, e, 444] TJ
TJ是“绘图文本”指令。该数组包含字符对及其字距信息。
现在,对于任何类型的文本提取工作(在iText和Foxit,Adobe等的复制/粘贴功能中),您需要一些猜测。 (通常称为启发式)。
你需要决定一些角色何时粘在一起形成一个单词,当两个角色相距足够远时,它们之间应该有一个空格。
在您的用例中,似乎“n”和“i”之间的距离大于该字体的预期距离。
可悲的是,iText将无法(轻松)帮助您。由于输入文档似乎不正确。或者更确切地说,大多数读者/观众似乎都错了,所以它可能只是pdf中的一个问题。
当然,您可以实现TextExtractionStrategy。通过此类,您可以访问包含pdf中字符和图形状态的TextRenderInfo对象。然后,大多数TextExtractionStrategies将检查正在使用的字体中空格的大小,并将其用作参考,以决定何时应该连接字符,以及何时应将它们分开。
最后,如果您想深入研究此问题,可以随时附加输入文档。
亲切的问候, 里斯