首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文本搜索PDF

文本搜索PDF
EN

Stack Overflow用户
提问于 2011-05-15 15:28:09
回答 2查看 1.9K关注 0票数 1

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-18 05:34:57

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

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

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

代码语言:javascript
复制
/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开始映射值(并继续,直到没有更多的东西需要映射。

例如:

代码语言:javascript
复制
<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>

可以表示为

代码语言:javascript
复制
<0003><0003><0020>
<0024><0032><0041>

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

还有beginbfchar/endbfchar,它只接受两个参数(src和dest值,没有范围),基于CID的版本(在这一点上,你需要访问Adobe的字符ID表。它们是Acrobat/Reader安装的一部分,尽管Reader需要下载各种语言包(或工具包或其他名称),以及各种其他东西,您可以通过阅读该规范来了解相关信息。

票数 2
EN

Stack Overflow用户

发布于 2011-05-15 16:39:08

可以通过多种方式对此数据进行编码(其中一些使用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/)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6007101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档