无法使用带有 .net 的 iText 7 从 pdf 解析希伯来语文本

Fails to parse Hebrew text from pdf using iText 7 with .net

我正在尝试在 .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 级别有特定的自定义编码我无法解析 read/parse。

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

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

谢谢 亚尼夫

共享文件分析

file1_copyPasteWorks.pdf

此处的字体定义有一个无效的 ToUnicode 条目:

/ToUnicode/Identity-H

ToUnicode 值指定为

A stream containing a CMap file that maps character codes to Unicode values

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

Identity-Hname,不是 stream.

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

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

因此,在这种情况下,Adobe Reader 通过将含义解释为无效的数据片段(如果不这样做也是 returns 废话)来获得更好的结果。

file2_copyPasteFails.pdf

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

这里的 Adob​​e Reader 和 iText 7 都信任 ToUnicode 映射,因此无法映射希伯来字形。

如何解析

file1_copyPasteWorks.pdf

对于此文件,“问题”是 iText 7 应用了 Encoding 映射。因此,为了解码文本,可以暂时用恒等映射替换 Encoding 映射:

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 映射并将其注入到上述字体中。