【问题标题】:Text searching PDF文本搜索 PDF
【发布时间】:2011-05-15 07:28:08
【问题描述】:

在解析 PDF 时,给定一个带有 Identity-H 编码的字符串(从 Tj 或 TJ 运算符回调中弹出),如何将该字符串映射到 unicode(比如 UTF8)表示?

如果我需要一个 CMap,我该如何创建(或检索)和应用 CMap?

【问题讨论】:

    标签: ios pdf


    【解决方案1】:

    您可能必须自己解析字体数据。 Identity-H 仅表示“将字节用作给定字体的原始字形索引”。这就是为什么在使用 Identity-H 时必须嵌入字体...同一字体的不同版本不必具有相同的字形顺序。

    在几个不同的开源项目中有关于如何做这类事情的示例代码。例如 iText(是的,我有偏见)。


    你提到了一个 CMap。 Identity-H 字体可以有一个 CMap,但不是必须的。 /ToUnicode 条目将是一个 CMap 流,如某些 adobe 规范中所定义的那样。它们并不那么复杂:

    /CIDInit /ProcSet findresource begin  
    12 dict begin  
    begincmap  
    /CIDSystemInfo  
    << /Registry (TTX+0)  
    /Ordering (T42UV)  
    /Supplement 0  
    >> def  
    /CMapName /TTX+0 def  
    /CMapType 2 def
    1 begincodespacerange  
    <0000><FFFF>  
    endcodespacerange  
    80 beginbfrange  
    <0003><0003><0020>  
    <0024><0024><0041>  
    <0025><0025><0042>  
    <0026><0026><0043>  
    <0027><0027><0044>  
    <0028><0028><0045>  
    <0029><0029><0046>  
    <002a><002a><0047>  
    <002b><002b><0048>
    <002c><002c><0049>
    <002d><002d><004a>
    <002e><002e><004b>
    <002f><002f><004c>
    <0030><0030><004d>
    <0031><0031><004e>
    <0032><0032><004f>
    <0033><0033><0050>
    <0034><0034><0051>
    <0035><0035><0052>
    <0036><0036><0053>
    <0037><0037><0054>
    <0038><0038><0055>
    <0039><0039><0056>
    <003a><003a><0057>
    <003b><003b><0058>
    <003c><003c><0059>
    <003d><003d><005a>
    <0065><0065><00c9>
    <00c8><00c8><00c1>
    <00cb><00cb><00cd>
    <00cf><00cf><00d3>
    <00d2><00d2><00da>
    <00e2><00e2><0160>
    <00e4><00e4><017d>
    <00e9><00e9><00dd>
    <00fd><00fd><010c>
    <0104><0104><0104>
    <0106><0106><010e>
    <0109><0109><0118>
    <010b><010b><011a>
    <0115><0115><0147>
    <011b><011b><0158>
    <0121><0121><0164>
    <0123><0123><016e>
    <01a0><01a0><0116>
    <01b2><01b2><012e>
    <01cb><01cb><016a>
    <01cf><01cf><0172>
    <022c><022c><0401>
    <023b><023b><0411>
    <023c><023c><0412>
    <023d><023d><0413>
    <023e><023e><0414>
    <023f><023f><0415>
    <0240><0240><0416>
    <0241><0241><0417>
    <0242><0242><0418>
    <0243><0243><0419>
    <0244><0244><041a>
    <0245><0245><041b>
    <0246><0246><041c>
    <0247><0247><041d>
    <0248><0248><041e>
    <0249><0249><041f>
    <024a><024a><0420>
    <024b><024b><0421>
    <024c><024c><0422>
    <024d><024d><0423>
    <024e><024e><0424>
    <024f><024f><0425>
    <0250><0250><0426>
    <0251><0251><0427>
    <0252><0252><0428>
    <0253><0253><0429>
    <0254><0254><042a>
    <0255><0255><042b>
    <0256><0256><042c>
    <0257><0257><042d>
    <0258><0258><042e>
    <0259><0259><042f>
    endbfrange
    endcmap
    CMapName currentdict /CMap defineresource pop
    end end
    

    哇。那个特定的 CMap 效率极低。 “bfrange”从参数 1 开始,进入并包含参数 2,映射从参数 3 开始的值(一直持续到没有要映射的内容为止。

    例如:

    <0003><0003><0020>
    <0024><0024><0041>
    <0025><0025><0042>
    <0026><0026><0043>
    <0027><0027><0044>
    <0028><0028><0045>
    <0029><0029><0046>
    <002a><002a><0047>
    <002b><002b><0048>
    <002c><002c><0049>
    <002d><002d><004a>
    <002e><002e><004b>
    <002f><002f><004c>
    <0030><0030><004d>
    <0031><0031><004e>
    <0032><0032><004f>
    

    可以表示为

    <0003><0003><0020>
    <0024><0032><0041>
    

    A quick google search turned up the CMap/CID font spec.

    还有 beginbfchar/endbfchar 只接受两个参数(src 和 dest 值,无范围),基于 CID 的版本(此时您需要访问 Adob​​e 的字符 ID 表。它们是一部分Acrobat/Reader 的安装,但需要促使 Reader 下载各种语言包(或工具包或其他名称),以及您真正需要阅读该规范以了解的各种其他内容。

    【讨论】:

    • 在我的例子中,当当前字体具有编码“Identity-H”时,嵌入字体有一个 FontDescriptor,其流包含带有键“Filter”和值“FlateDecode”的字典。这是否意味着我只需要使用 zLib 解压缩(例如)Tj 中的文本来获取 unicode 字符串? (当然不是……)
    • 正确。字体文件(或其中的一部分)是用 zLib 压缩的。您需要解压缩它并阅读字体的字形->字符表[s] 以找出 Tj 中的哪些字符是什么意思。只是为了好玩,字体子集不需要包含该信息......此时它是“OCR 或半身像”。
    • 非常感谢您的回复和耐心,这对我帮助很大。从 PDF 指南中我不清楚的一件事是如何使用 CMap 文件。 [我现在正在查看“Adobe-Japan1-UCS2”。] 鉴于此,我是否在这里自己创建一个 hashmap 和扫描仪,或者是否有 C-convenience 方法将采用一串字符代码和 CMap 文件的内容作为输入并返回一个字符串?我不知道这里的标准做法是什么。
    【解决方案2】:

    可以通过多种方式对这些数据进行编码(一些使用 CMAP)。您还可以使用自定义编码 (http://www.jpedal.org/PDFblog/2011/04/understanding-the-pdf-file-format-%E2%80%93-custom-font-encodings/)。您还需要了解 CID 字体(http://www.jpedal.org/PDFblog/2011/03/understanding-the-pdf-file-format-%E2%80%93-what-are-cid-fonts/)

    【讨论】:

    • 非常感谢您的回复。我有 PDF 的官方指南,我已经阅读了一些,详细阅读的决定正在等待中。我正在浏览您的链接 - 谢谢这些。
    猜你喜欢
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多