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

时间:2017-08-13 16:33:32

标签: c# itext

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);
        }
    }
}

非常感谢任何帮助。

2 个答案:

答案 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测试了这个,因为我对它更熟练。

iText 5.x / Java

这个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 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");
}

答案 1 :(得分:1)

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

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