从一个 PDF 中提取到 Unicode 映射并在另一个 PDF 中使用

Nar*_*ois 2 pdf unicode

我有一个 Unicode PDF 文档,缺少 toUnicode 映射。我有一个不同的 PDF,具有相同的字体,其中包含 toUnicode 映射。我可以从一个 PDF 中提取它并使用它从另一个 PDF 中提取文本吗?

ole*_*ksa 7

对于 Unicode 映射,Adobe 有特殊资源 /ToUnicode 您可以在字体资源描述内的 pdf 文件中找到它。看起来像

<</BaseFont /ONWALI+Sylfaen/DescendantFonts [10 0 R]/Encoding /Identity-H/Subtype /Type0/ToUnicode 11 0 R/Type /Font>>
Run Code Online (Sandbox Code Playgroud)

并且/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
Run Code Online (Sandbox Code Playgroud)

ToUnicode 资源通常是压缩的,因此您必须解压缩它才能获得如上所述的文本。

然后我编写了代码,获取 pdf(来自 Misrosoft Reporting 中生成的报告)并为找到的每种字体添加 /ToUnicode 资源。Pdf 具有带指针的外部参照表,您无法将其作为文本文件进行编辑。所以你必须使用一些pdf引擎(我使用过PDFTron,但itext应该足够了)。每次我需要将报告保存为 pdf 时都会执行此后处理代码。实际上 ToUnicode 映射应该由 Microsoft Reporting 引擎填充,但它好得令人难以置信。

就是这样。