使用 iTextSharp 从 PDF 中提取文本不适用于某些 PDF
本文关键字:PDF 适用于 不适用 取文本 提取 iTextSharp 使用 | 更新日期: 2023-09-27 18:32:16
我使用以下代码使用 iTextSharp 从 PDF 文件的第一页中提取文本:
public static string ExtractTextFromPDFFirstPage(string fileName)
{
string text = null;
using (var pdfReader = new PdfReader(fileName))
{
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
text = PdfTextExtractor.GetTextFromPage(pdfReader,1,strategy);
text = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(text)));
}
return text;
}
它适用于许多PDF,但不适用于其他一些PDF。
工作 PDF : http://data.hexagosoft.com/LFBO.pdf
不工作 PDF : http://data.hexagosoft.com/LFBP.pdf
这两个PDF似乎非常相似,但一个有效,另一个无效。我想他们的生产者标签不一样的事实是这里的一个线索。另一个线索是,此功能适用于没有图表的 PDF 的任何其他页面。
我也尝试过用ghostscipt,但没有成功。
编码行似乎也没用。
如何使用 iTextSharp 提取非工作 PDF 第一页的文本?
谢谢
这两个文档都在其编码/差异数组中使用带有非官方字形名称的字体,并且都不使用 ToUnicode 映射。字形命名似乎有些直截了当:MT 前缀后面的数字是所用字形的 ASCII 代码。
第一个文档有效,因为映射根本没有更改,iText 将使用默认编码(我猜):
/Differences[65/MT65/MT66/MT67 71/MT71/MT72/MT73 76/MT76 78/MT78 83/MT83]
另一个文档确实更改了映射:
/Differences [2 /MT76 /MT105 /MT103 /MT104 /MT116 /MT110 /MT32 /MT97 /MT100 /MT115 /MT58 ]
这意味着:例如,字符代码 2 应映射到名为 MT76 的字形,这是 iText 不知道的非正式/私有字形名称,因此它没有更多信息,只有字符代码 2,并将使用此代码作为最终结果(我猜)。
如果不实现以 MT 为前缀的字形名称的逻辑,就不可能从本文档中获取正确的文本。无论如何,没有任何地方定义以 MT 开头后跟整数的字形名称可以映射到 ASCII 值......这只是偶然的,或者由字体设计器/创建工具实现,无论它来自哪里。
第 2 个 PDF (LFBP.pdf) 包含从字形到文本的错误映射,即您看到正确的字形,但在生成此 PDF 期间由于某种原因文本表示未正确编码。如果你有很多这样的文件,那么工作方法可能是:
- 通过搜索应该出现在每个页面上的一些短语(例如"服务")来检测损坏的页面,同时提取文本
- 使用 OCR 和 Tesseract 和 .NET Wraper 等工具分别处理这些页面