Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Type0 CMap解析的问题_Ios_Pdf_Fonts_Adobe_Scanning - Fatal编程技术网

Ios Type0 CMap解析的问题

Ios Type0 CMap解析的问题,ios,pdf,fonts,adobe,scanning,Ios,Pdf,Fonts,Adobe,Scanning,我目前正在使用PDFKitten进行iOS PDF扫描。 我正在尝试提取文本,以便在具有Type0字体的PDF中搜索。我无法从PDF中提取文本。 ToUnicode中的某些条目缺失,有些条目被误解。 CMap的解析会有问题吗? 如果我没有完整的CMap,我应该如何推导它? 我可以为这些缺少的TOINCODE条目获取外部条目吗 感谢第9.10.2节“将字符代码映射到Unicode值”中提供了有关如何提取文本内容的提示: 如果字体字典包含ToUnicodeCMap(请参阅9.10.3“ToUnic

我目前正在使用PDFKitten进行iOS PDF扫描。 我正在尝试提取文本,以便在具有Type0字体的PDF中搜索。我无法从PDF中提取文本。 ToUnicode中的某些条目缺失,有些条目被误解。 CMap的解析会有问题吗? 如果我没有完整的CMap,我应该如何推导它? 我可以为这些缺少的TOINCODE条目获取外部条目吗

感谢

第9.10.2节“将字符代码映射到Unicode值”中提供了有关如何提取文本内容的提示:

  • 如果字体字典包含ToUnicodeCMap(请参阅9.10.3“ToUnicode CMap”),请使用该CMap将字符代码转换为Unicode

  • 如果字体是使用预定义编码之一的简单字体,MacRomanEncodingMacExpertEncodingWinAnScienceODing,或者其编码的差异数组仅包含取自Adobe标准拉丁字符集的字符名和符号字体中的命名字符集(见附录D):

    a) 根据表D.1和字体的差异数组,将字符代码映射到字符名称

    b) 在Adobe Glyph列表(参见参考书目)中查找字符名称以获得 对应的Unicode值

  • 如果字体是使用表118中列出的预定义CMAP之一的复合字体(Identity–H和Identity–V除外),或者其子代CIDFont使用Adobe-GB1、Adobe-CNS1、Adobe-Japan1或Adobe-Korea1字符集:

    a) 根据字体的CMap将字符代码映射到字符标识符(CID)

    b) 从其CIDSystemInfo字典中获取字体的CMap(例如Adobe和Japan1)使用的字符集合的注册表和顺序

    c) 通过将注册表和步骤(b)中获得的排序以注册表–排序–UCS2(例如Adobe–Japan1–UCS2)的格式连接起来,构造第二个CMap名称

    d) 使用步骤(c)中构造的名称获取CMap(可从ASN网站获得;请参阅参考书目)

    e) 根据步骤(d)中获得的CMap映射步骤(a)中获得的CID,生成Unicode值

此外,如第9.10.1节所述

  • 结构元素或标记内容序列的ActualText条目(见14.9.4,“替换 “文本”)可用于直接指定文本内容
根据规范,如果这些方法无法生成Unicode值,则无法确定字符代码代表什么。这并不完全正确;e、 g.嵌入式字体程序可能包含其自身到Unicode的映射;但这些额外的信息来源超出了实际的PDF格式

编辑

OP通过邮件提供了相关文件iPhoneConfigurationProfileRef-2013-GM.pdf,并指出

每一个雕文都有问题

问题是PDF中的范围不完整,并且与adobe identity cmap文件不同

如果我只使用嵌入在PDF中的CMap,我不会得到每个字符的映射,如果我使用adobe one,所有映射都是错误的

由于他没有得到任何glyph的映射,让我们以标题页为例

内容流包含以下与文本提取相关的操作:

BT 
50 0 0 50 60 669.225 Tm 
/G1 1 Tf 
<0025> Tj 
ET 
BT 
50 0 0 50 87.6 669.225 Tm 
/G1 1 Tf 
<005100500048004b004900570054> Tj 
ET 
BT 
50 0 0 50 238 669.225 Tm 
/G1 1 Tf 
<0043> Tj 
ET 
BT 
50 0 0 50 261.45 669.225 Tm 
/G1 1 Tf 
<0056004b00510050> Tj 
ET 
BT 
50 0 0 50 355.4 669.225 Tm 
/G1 1 Tf
<0032> Tj 
ET 
BT 
50 0 0 50 380.75 669.225 Tm 
/G1 1 Tf 
<0054> Tj 
ET 
BT 
50 0 0 50 396.55 669.225 Tm 
/G1 1 Tf 
<00510048004b004e0047> Tj 
ET 
BT 50 0 0 50 60 609.225 Tm 
/G1 1 Tf 
<0034> Tj 
ET 
BT 
50 0 0 50 86.65 609.225 Tm 
/G1 1 Tf 
<00470048> Tj 
ET 
BT
50 0 0 50 125.05 609.225 Tm 
/G1 1 Tf 
<00470054> Tj 
ET 
BT 
50 0 0 50 165.45 609.225 Tm 
/G1 1 Tf 
<004700500045> Tj 
ET 
BT 
50 0 0 50 238.9 609.225 Tm 
/G1 1 Tf 
<0047> Tj 
ET
这与页面的外观非常匹配:

第9.10.2节“将字符代码映射到Unicode值”中提供了有关如何提取文本内容的提示:

  • 如果字体字典包含ToUnicodeCMap(请参阅9.10.3“ToUnicode CMap”),请使用该CMap将字符代码转换为Unicode

  • 如果字体是使用预定义编码之一的简单字体,MacRomanEncodingMacExpertEncodingWinAnScienceODing,或者其编码的差异数组仅包含取自Adobe标准拉丁字符集的字符名和符号字体中的命名字符集(见附录D):

    a) 根据表D.1和字体的差异数组,将字符代码映射到字符名称

    b) 在Adobe Glyph列表(参见参考书目)中查找字符名称以获得 对应的Unicode值

  • 如果字体是使用表118中列出的预定义CMAP之一的复合字体(Identity–H和Identity–V除外),或者其子代CIDFont使用Adobe-GB1、Adobe-CNS1、Adobe-Japan1或Adobe-Korea1字符集:

    a) 根据字体的CMap将字符代码映射到字符标识符(CID)

    b) 从其CIDSystemInfo字典中获取字体的CMap(例如Adobe和Japan1)使用的字符集合的注册表和顺序

    c) 通过将注册表和步骤(b)中获得的排序以注册表–排序–UCS2(例如Adobe–Japan1–UCS2)的格式连接起来,构造第二个CMap名称

    d) 使用步骤(c)中构造的名称获取CMap(可从ASN网站获得;请参阅参考书目)

    e) 根据步骤(d)中获得的CMap映射步骤(a)中获得的CID,生成Unicode值

此外,如第9.10.1节所述

  • 结构元素或标记内容序列的ActualText条目(见14.9.4,“替换 “文本”)可用于直接指定文本内容
根据规范,如果这些方法无法生成Unicode值,则无法确定字符代码代表什么。这并不完全正确;e、 g.嵌入式字体程序可能会
/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
1 beginbfchar
<000f><002d 2010>
endbfchar
15 beginbfrange
<0002><0002><0020>
<0004><000c><0022>
<000e><000e><002c>
<0010><001d><002e>
<001f><001f><003d>
<0022><0032><0040>
<0034><003d><0052>
<003f><003f><005d>
<0041><0041><005f>
<0043><005c><0061>
<005e><005e><007c>
<008a><008a><00a9>
<00a4><00a4><2014>
<00a5><00a6><201c>
<00a8><00a8><2019>
endbfrange
endcmap
CMapName currentdict /CMap defineresource pop
end
end 
<0025> Tj                          % "C"       = <0043>                         due to <0022><0032><0040>
<005100500048004b004900570054> Tj  % "onfigur" = <006f006e00660069006700750072> due to <0043><005c><0061>
<0043> Tj                          % "a"       = <0061>                         due to <0043><005c><0061>
<0056004b00510050> Tj              % "tion"    = <00740069006f006e>             due to <0043><005c><0061>
<0032> Tj                          % "P"       = <0050>                         due to <0022><0032><0040>
<0054> Tj                          % "r"       = <0072>                         due to <0043><005c><0061>
<00510048004b004e0047> Tj          % "ofile"   = <006f00660069006c0065>         due to <0043><005c><0061>
<0034> Tj                          % "R"       = <0052>                         due to <0034><003d><0052>
<00470048> Tj                      % "ef"      = <00650066>                     due to <0043><005c><0061>
<00470054> Tj                      % "er"      = <00650072>                     due to <0043><005c><0061>
<004700500045> Tj                  % "enc"     = <0065006e0063>                 due to <0043><005c><0061>
<0047> Tj                          % "e"       = <0065>                         due to <0043><005c><0061>