[我正在尝试在.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级别存在特定的自定义编码。
任何想法如何正确解析文档?
谢谢Yaniv
这里的字体定义有一个无效的ToUnicode条目:
/ToUnicode/Identity-H
ToUnicode值指定为
包含将字符代码映射到Unicode值的CMap文件的流
(ISO 32000-2,表119-Type 0字体字典中的条目)
Identity-H是name,而不是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
映射,因此不能映射希伯来字形。如何解析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