【问题标题】:Extract toUnicode map from One PDF and use in another从一个 PDF 中提取到 Unicode 映射并在另一个 PDF 中使用
【发布时间】:2012-12-02 09:45:00
【问题描述】:

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

【问题讨论】:

    标签: pdf unicode


    【解决方案1】:

    一般的答案是否定的。您所说的 ToUnicode 映射遵循 PDF CMap 格式,用于将字符代码转换为 Unicode 值。您面临两个潜在的陷阱:

    1) 字体不完全相同。虽然它们的名称可能相同,但它们可能具有不同的编码,或者可能包含不同的字形(即使对于相同的编码)。在那种情况下,从不同的字体应用 CMap 会给你不正确的 unicode 值。

    2) 字体可能在所有方面都相同,但可能会在 PDF 文件中进行子集化(可能),并且子集可能不同。在某些情况下,这不会改变字体在 PDF 文件中的存储方式,但有一些优化的 PDF 编写器会将它们可以压缩的任何内容压缩为子集字体,这可能会导致使用不同的字符代码并最终不同ToUnicode 地图。

    【讨论】:

    • David PDF 是从 Microsoft SSRS 生成的,只使用了一种字体,如果需要,我愿意手动创建一个 cmap 文件。我必须从数千个 PDF 中提取文本,并且可以手动尝试将 char 代码映射到 unicode 值。我需要有关可以帮助我实现这一目标的代码建议。
    • 字体是否被 Microsoft SSRS 子集化了?您拥有的所有文件都是由同一个应用程序生成的吗?如果在所有情况下都使用相同的字体并使用相同的生成应用程序,我认为值得尝试将现有的 ToUnicode CMap 简单地复制到另一个文件中。
    • 生产者是什么?是 iTextSharp 吗? (打开文档属性以找到答案。)如果我们了解制作人,我们就知道会发生什么。例如:如果字体被子集化,您的尝试将失败:并非所有文档都需要相同的字符。
    • 所有文档均由同一个应用程序创建,PDF Producer 报告为 Microsoft Reporting Services PDF Rendering Extension 10.0。 PDF 版本为 1.3 ,文档中的数据包含字体的所有可能选项,(但字体是嵌入的子集),我有大量文件因此愿意付出努力。
    • @NareshJois 你会提供两到三个样品进行检查吗?根据字体的嵌入方式,可以为每个嵌入的字形按其在文档中首次出现的顺序递增地分配字符标识符。在这种情况下,您将找不到要添加到所有文档的通用地图。
    【解决方案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 引擎填充,但这好得令人难以置信。

    就是这样。

    【讨论】:

    • 我正在尝试使用 iText 复制此内容,到目前为止,我看到了嵌入在 pdf 中的 ToUnicode 流和添加到 /Font 字典中的 /ToUnicode 条目,但是当我打开 pdf 时它仍然没有映射字符。有什么建议吗?
    • @sq33G 尝试保存未压缩的流以检查映射是如何手动保存的。我想您还没有映射所有字符。您可以使用 Adob​​e Pro 来验证 pdf。 Adobe 验证显示映射中遗漏的字符代码。
    • 太棒了!我有错误的 CMapName - 它必须与字体的注册表/排序/补充相匹配。漂亮!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多