iTextSharp库(版本5.5.5)不从我的文件中提取文本。 我可以将pdf中的文本复制并粘贴到记事本中。 我将文件上传到this链接。
源代码非常简单,适用于其他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);
}
}
}
非常感谢任何帮助。
答案 0 :(得分:3)
示例PDF中亚洲字体的PDF声明不包含 ToUnicode 映射,以允许从字符代码映射到Unicode。
此外,它们的编码是 Identity-H ,这是一种伪编码,因为它只是将0到65,535之间的2字节字符代码映射到相同的2字节CID值,所以这仍然没有定义可用于文本提取的固定编码。
Identity-H 实际上只能与使用任何注册表,订购和补充值的CIDFonts一起使用,这些 ROS 值传达实际的编码信息,从中可以导出到Unicode的映射。这是您文件中的情况。
要在文本提取过程中使用这些 ROS 值,iText需要一组资源文件来定义不同预定义 ROS 值的映射。由于这些文件非常庞大,它们不是标准iText主要分发jar / dll的一部分,但必须作为单独的jar / dll文件添加到类路径中。
我只使用Java版本的iText测试了这个,因为我对它更熟练。
这个jar工件的5.x版本的Maven坐标:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
(由于近年来这些资源没有任何变化,自5.2.0以来没有5.x版本。)
将jar添加到类路径后,我可以成功从PDF中提取亚洲字符。他们是否100%正确,我不能说因为我无法阅读它们。
应该有类似的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"); }
答案 1 :(得分:1)
我对@mkl给出的答案有所补充。以下是如何通知iTextSharp亚洲dll在项目中。您需要添加您的文本提取类的静态构造函数:
static PdfDocument()
{
iTextSharp.text.io.StreamUtil.AddToResourceSearch("iTextAsian.dll");
iTextSharp.text.io.StreamUtil.AddToResourceSearch("iTextAsianCmaps.dll");
}