首页 > 解决方案 > 无法使用 iText 7 和 .net 解析来自 pdf 的希伯来语文本

问题描述

我正在尝试使用 .NET CORE 2.1 上的 iText 7 阅读包含多页的 PDF 文件以下是我的代码:

Rectangle rect = new Rectangle(0, 0, 1100, 1100);
LocationTextExtractionStrategy strategy = new LocationTextExtractionStrategy();
inputStr = PdfTextExtractor.GetTextFromPage(pdfDocument.GetPage(i), strategy);

inputStr 获取以下字符串:

"\u0011\v\u000e\u0012\u0011\v\f)(*).=*%'\f*).5?5.5*.\a \u0011\u0002\u001b\u0001!\u0016\u0012\u001a!\u0001\u0015\u001a \u0014\n\u0015\u0017\u0001(\u001b)\u0001)\u0016\u001c*\u0012\u0001\u001d\u001a \u0016* \u0015\u0001\u0017\u0016\u001b\u001a(\n,\u0002>&\u00...

在 Text Visualizer 中,它看起来像这样:

)(*).=*%'*).5?5.5*. !! 
())* * (
,>&2*06) 2.-=9 )=&,

2..*0.5<.?
.110
)<1,3
    2.3*1>?)10/6
     (& >(*,1=0>>*1?

    2.63)&*,..*0.5

   206)&13'?*9*<
    *-5=0>
  ?*&..,?)..*0.5

看起来我无法解析编码,或者在我无法读取/解析的 PDF 级别有特定的自定义编码。

查看文档属性,在字体下它显示以下内容: PDF 文档属性字体设置

任何想法如何正确解析文档?

谢谢亚尼夫

标签: asp.net-core-2.0itext7

解决方案


共享文件分析

file1_copyPasteWorks.pdf

这里的字体定义有一个无效的ToUnicode条目:

/ToUnicode/Identity-H

ToUnicode指定为

包含将字符代码映射到 Unicode 值的 CMap 文件的流

(ISO 32000-2,表 119 — Type 0 字体字典中的条目)

Identity-H是一个名称,而不是一个

尽管如此,Adobe Reader 会解释这个名称,显然任何以Identity-开头的名称都假定字体的文本编码为 UCS-2(本质上是 UTF-16)。由于文档中使用的字符代码确实如此,即使出于错误的原因,复制和粘贴也有效。(没有这个ToUnicode值,Adobe Reader 也会返回废话。)

另一方面,iText 7 映射到 Unicode 首先遵循Encoding值,但结果出乎意料。

因此,在这种情况下,Adobe Reader 通过将含义解释为无效的数据(并且没有它也会返回废话)来获得更好的结果。

file2_copyPasteFails.pdf

此处的字体定义具有有效但不完整的ToUnicode映射,其中仅包含使用的西欧字符的条目,但不包含希伯来语字符的条目。他们没有编码条目。

Adobe Reader 和 iText 7 都信任ToUnicode映射,因此无法映射希伯来字形。

如何解析

file1_copyPasteWorks.pdf

在这个文件的情况下,“问题”是 iText 7 应用了编码映射。因此,为了解码文本,可以暂时将编码映射替换为标识映射:

for (int i = 1; i <= pdfDocument.GetNumberOfPages(); i++)
{
    PdfPage page = pdfDocument.GetPage(i);
    PdfDictionary fontResources = page.GetResources().GetResource(PdfName.Font);
    foreach (PdfObject font in fontResources.Values(true))
    {
        if (font is PdfDictionary fontDict)
            fontDict.Put(PdfName.Encoding, PdfName.IdentityH);
    }

    string output = PdfTextExtractor.GetTextFromPage(page);
    // ... process output ...
}

此代码显示文件 1 的希伯来语字符。

file2_copyPasteFails.pdf

在这里,我没有快速的解决方法。您可能想要分析多个此类 PDF。如果它们都以相同的方式对希伯来字符进行编码,您可以从中创建自己的ToUnicode映射并将其注入到上述字体中。


推荐阅读