我有一个错过toUnicode地图的Unicode PDF文档。我有一个不同的PDF与相同的字体有toUnicode地图。我可以从一个PDF中提取它并使用它从另一个PDF中提取文本吗?
答案 0 :(得分:3)
通用答案是否定的。您正在谈论的ToUnicode映射遵循PDF CMap格式,用于将字符代码转换为Unicode值。你面临两个潜在的陷阱:
1)字体不完全相同。虽然它们的名称可能相同,但它们可能具有不同的编码,或者可能包含不同的字形(即使对于相同的编码)。在这种情况下,从不同的字体应用CMap会给你不正确的unicode值。
2)字体在所有方面可以是相同的,但可以在PDF文件中(可能)进行子集化,并且子集可以是不同的。有些情况下,这不会改变字体存储在PDF文件中的方式,但有优化的PDF编写器会压缩子集化字体中的任何内容,这可能会导致使用不同的字符代码,最终会有所不同ToUnicode地图。
答案 1 :(得分:3)
对于Unicode映射,Adobe具有特殊资源/ ToUnicode 您可以在字体资源描述中的pdf文件中找到它。它看起来像
<</BaseFont /ONWALI+Sylfaen/DescendantFonts [10 0 R]/Encoding /Identity-H/Subtype /Type0/ToUnicode 11 0 R/Type /Font>>
和/ToUnicode 11 0 R
是您在pdf文件中需要的。 11 0
是资源ID
我在Acrobat Pro中使用所有字母符号创建了样本pdf,以使用报告中使用的相同字体进行标准ToUnicode映射。我已经将资源提取为文本,它看起来像:
/CIDInit /ProcSet findresource begin
12 dict begin
begincmap
/CIDSystemInfo
<< /Registry (Adobe)
/Ordering (UCS) /Supplement 0 >> def
/CMapName /Adobe-Identity-UCS def
/CMapType 2 def
1 begincodespacerange
<0000> <FFFF>
endcodespacerange
50 beginbfchar
<0003> <0020>
...and so on...
endbfchar
endcmap CMapName currentdict /CMap defineresource pop end end
通常压缩ToUnicode资源,因此您必须将其解压缩才能获得上述文本。
然后我编写了带有pdf的代码(来自Misrosoft Reporting中生成的报告),并为找到的每种字体添加/ ToUnicode资源。 Pdf具有带指针的外部参照表,您无法将其编辑为文本文件。所以你必须使用一些pdf引擎(我已经使用过PDFTron但是itext应该足够了)。每次我需要将报告保存为pdf时,都会执行此后处理代码。 实际上ToUnicode映射应该由Microsoft报告引擎填充,但实在太好了。
那就是它。