searchPDF的文本

当parsing一个PDF,给定一个string(从Tj或TJ操作符callback)与身份H编码如何映射该string到一个Unicode(如UTF8)表示?

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

你可能不得不parsing字体数据本身。 标识H只是意味着“使用字节作为原始字形索引到给定的字体”。 这就是为什么在使用Identity-H时必须embedded字体…相同字体的不同版本不必具有相同的字形顺序。

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


你提到了一个CMap。 Identity-H字体可以有一个CMap,但不需要这样做。 / ToUnicode条目将是一个CMap的stream,正如在某些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> 

快速谷歌search调出了CMap / CID字体规范 。

还有一些beginbfchar / endbfchar ,它们只有两个参数(src和dest值,没有范围),基于CID的版本(在这一点上,您需要访问Adobe的字符ID表,它们是Acrobat / Reader安装的一部分读者将需要被下载各种语言包(或套件或任何他们被称为),以及其他各种你真的阅读该规范了解。