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

问题描述 投票:0回答:1

[我正在尝试在.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...

并且在文本可视化器中,看起来像这样:

)(*).=*%'*).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 Document Properties Fonts Settings

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

谢谢Yaniv

asp.net-core-2.0 itext7
1个回答
1
投票

共享文件分析

file1_copyPasteWorks.pdf

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

/ToUnicode/Identity-H

ToUnicode值指定为

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

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

Identity-Hname,而不是stream

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

另一方面,用于映射到Unicode的iText 7,紧随

Encoding

值之后,具有意外结果。因此,在这种情况下,Adobe Reader通过将含义解释为无效的数据获得更好的结果(如果没有,则返回无意义。

file2_copyPasteFails.pdf

此处的字体定义具有有效但不完整的

ToUnicode

映射,其中仅包含所用西欧字符的条目,但不包含希伯来字符的条目。他们没有Encoding条目。这里的Adobe 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

映射并将其注入上述字体中。
© www.soinside.com 2019 - 2024. All rights reserved.