无法使用带有 .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-H 是 name,不是 stream.
尽管如此,Adobe Reader 解释了这个名称,显然对于任何以 Identity- 开头的名称,假定字体的文本编码为 UCS-2(本质上UTF-16)。由于文档中使用的字符代码确实是这种情况,因此复制和粘贴有效,即使出于错误的原因。 (没有这个ToUnicode值,AdobeReader也returns废话。)
iText 7,另一方面,为了映射到 Unicode,首先遵循 Encoding 值,结果出乎意料。
因此,在这种情况下,Adobe Reader 通过将含义解释为无效的数据片段(如果不这样做也是 returns 废话)来获得更好的结果。
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 映射并将其注入到上述字体中。
我正在尝试在 .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-H 是 name,不是 stream.
尽管如此,Adobe Reader 解释了这个名称,显然对于任何以 Identity- 开头的名称,假定字体的文本编码为 UCS-2(本质上UTF-16)。由于文档中使用的字符代码确实是这种情况,因此复制和粘贴有效,即使出于错误的原因。 (没有这个ToUnicode值,AdobeReader也returns废话。)
iText 7,另一方面,为了映射到 Unicode,首先遵循 Encoding 值,结果出乎意料。
因此,在这种情况下,Adobe Reader 通过将含义解释为无效的数据片段(如果不这样做也是 returns 废话)来获得更好的结果。
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 映射并将其注入到上述字体中。