我有一个 Unicode PDF 文档,其中缺少 toUnicode 映射。我有一个具有相同字体的不同 PDF,它具有 toUnicode 映射。我可以从一个 PDF 中提取它并使用它从另一个 PDF 中提取文本吗?
2 回答
对于 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 Reporting 引擎填充,但它好得令人难以置信。
而已。
一般的答案是否定的。您所说的 ToUnicode 映射遵循 PDF CMap 格式,用于将字符代码转换为 Unicode 值。您面临两个潜在的陷阱:
1)字体不完全相同。虽然它们的名称可能相同,但它们可能具有不同的编码,或者可能包含不同的字形(即使对于相同的编码)。在这种情况下,从不同的字体应用 CMap 会给你不正确的 unicode 值。
2)字体可能在所有方面都相同,但可能在 PDF 文件中被子集(可能)并且子集可能不同。在某些情况下,这不会改变字体在 PDF 文件中的存储方式,但有优化的 PDF 编写器会将它们可以压缩的任何内容压缩为子集字体,这可能会导致使用不同的字符代码并最终不同ToUnicode 地图。