iTextSharp库不从我的文件中提取文本

iTextSharp库(版本5.5.5)不从我的文件中提取文本。 我可以将pdf中的文本复制并粘贴到记事本中。 我将文件上传到此链接。

源代码非常简单,适用于其他pdf文件,但对于这个有问题的文件,我得到的是一些没有任何意义的字符。

var text = string.Empty; using (var file = new File.OpenRead(path)) { using (var reader = new PdfReader(file)) { for (int pageNumber = 1; pageNumber <= reader.NumberOfPages; pageNumber++) { text += PdfTextExtractor.GetTextFromPage(reader, pageNumber); } } } 

任何帮助都非常感谢。

示例PDF中亚洲字体的PDF声明不包含ToUnicode映射,以允许从字符代码映射到Unicode。

此外,它们的编码是Identity-H ,它是一种伪编码,因为它只是将0到65,535之间的2字节字符代码映射到相同的2字节CID值,因此这仍然没有定义可用的固定编码用于文本提取。

Identity-H实际上可以仅使用任何RegistryOrderingSupplement值与CIDFonts一起使用,并且这些ROS值传达实际的编码信息,从中可以导出到Unicode的映射。 您的文件就是这种情况。

为了在文本提取期间使用这些ROS值,iText需要一组资源文件来定义不同预定义ROS值的映射。 由于这些文件非常庞大,它们不是标准iText主发行版jar / dll的一部分,但必须作为单独的jar / dll文件添加到类路径中。

我只使用Java版本的iText测试了这个,因为我对它更熟练。

iText 5.x / Java

这个jar工件的5.x版本的Maven坐标:

  com.itextpdf itext-asian 5.2.0  

(由于近年来这些资源没有任何变化,自5.2.0以来没有5.x版本。)

在我将jar添加到类路径后,我可以成功从PDF中提取亚洲字符。 他们是否100%正确,我不能说因为我无法阅读它们。

iTextSharp 5.x / .Net

应该有类似的iTextSharp DLL与亚洲字体资源。 (我发现了iText 7的变体,但我不确定它是否适用于5.x iTextSharp。)

Googl’ing周围发现了一些iTextAsian-*iTextAsianCmaps-*iTextAsian-all-*文件……但我不知道哪一个可以使用当前的iTextSharp 5.5.12。

随着OP的发现,还需要为iTextSharp注册DLL(与iText / Java相比):

以下是如何通知iTextSharp亚洲dll在项目中。 您需要添加您的文本提取类的静态构造函数:

 static PdfDocument() { iTextSharp.text.io.StreamUtil.AddToResourceSearch("iTextAsian.dll"); iTextSharp.text.io.StreamUtil.AddToResourceSearch("iTextAsianCmaps.dll"); } 

我还添加了@mkl给出的答案。 以下是如何通知iTextSharp亚洲dll在项目中。 您需要添加您的文本提取类的静态构造函数:

 static PdfDocument() { iTextSharp.text.io.StreamUtil.AddToResourceSearch("iTextAsian.dll"); iTextSharp.text.io.StreamUtil.AddToResourceSearch("iTextAsianCmaps.dll"); }