asp.net-core-2.0 - 无法使用 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 级别有特定的自定义编码。
任何想法如何正确解析文档?
谢谢亚尼夫
解决方案
共享文件分析
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映射并将其注入到上述字体中。
推荐阅读
- c++ - 是否可以使用带有立方体贴图颜色附件的深度渲染缓冲区?
- pine-script - Pine Script - 基于特定标准的多种背景颜色
- javascript - 反应钩子,而不是重新渲染
- javascript - 使用 esnext 构建 js 文件如何与 angular 2 一起使用
- windows - 关闭所有数字 - 所有打开的 matlab 实例/进程
- c++ - 当我尝试从 vbo 获取颜色时,glDrawElements 没有输出
- sql - 如何将请求的 SELECT 中的 PostgreSQL 数据透视表字段 (foo_id) 替换为其从 foo 表中获取的值?
- python - python - 将CSV列一分为二
- python - 试图理解多处理队列
- reactjs - 如何修复反应中的折叠按钮?