iTextSharp:执行GetTextFromPage时指定编码

时间:2017-04-04 14:59:29

标签: c# pdf itext

我正在使用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,[...]   (所以正确的字符,但有一个空格)

这是一个例子,但我还有一些例子。

知道如何解决这个问题吗?

1 个答案:

答案 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将检查正在使用的字体中空格的大小,并将其用作参考,以决定何时应该连接字符,以及何时应将它们分开。

最后,如果您想深入研究此问题,可以随时附加输入文档。

亲切的问候, 里斯