PDF中无法识别的字形(summationdisplay,summationtext)

时间:2016-08-25 02:40:32

标签: ruby pdf pdf-reader

我正在尝试使用pdf-reader gem处理PDF。它大部分都很好,但是在应该有一个求和符号的地方,我得到\u0001而不是\u2211。相关的字体对象是:

{:Type=>:Font,
 :Subtype=>:Type1,
 :FirstChar=>1,
 :LastChar=>2,
 :Widths=>[1444, 1056],
 :Encoding=>{:Type=>:Encoding, :Differences=>[1, :summationdisplay, :summationtext]},
 :BaseFont=>:"APHKGN+CMEX10",
 :FontDescriptor=>
  {:Type=>:FontDescriptor,
   :Ascent=>0,
   :CapHeight=>0,
   :Descent=>0,
   :Flags=>4,
   :FontBBox=>[0, -1400, 1387, 0],
   :FontName=>:"APHKGN+CMEX10",
   :ItalicAngle=>0,
   :StemV=>47,
   :StemH=>47,
   :CharSet=>"/summationdisplay/summationtext",
   :FontFile3=>
    #<PDF::Reader::Stream:0x007faab138a528
     @data=
      "H\x89bd`ab`dd\xE4s\f\xF0\xF0v\xF7\xD3v\xF6u\x8D04\x00\x89(\xFD\x90e\xFC!\xCE\xF2C\x8EG\xACX\xE6K\x81\f\xEB\xBA\x9F3X\xBF;\xF1\x7Fw\x13\xF8\xEE%\xB8\xE2\x87\xA7\x10\x03\vP\x9F\\rfqinnbIf~^IjE\t\x9C\x93\x92Y\\\x90\x93X\xE9\x9C_PY\x94\x99\x9EQ\xA2\xA0\xE1\xAC\xA9`hii\xAE\xE0\x98\x9BZ\x94\x99\x9C\x98\xA7\xE0\x9BX\x92\x91\nR\x9D\x9C\x98\xA3\x10\x9C\x9F\x9C\x99ZR\xA9\xA7\xE0\x98\x93\xA3\x10\x04\xD2Q\xAC\x10\x94Z\x9CZT\x96\x9A\x02u\x15\xD0Y\xED\x8C\fL\x01\x11\f\xCC\x8C\x8C\xECE?\xFF3\xFA\x86\x86\xF1\xFDg\x91\xEFO\xF8Ws\xE8\x97\xECf\xC6\x1F\xD5\x7Ff\x88N\x9A\xD2\xDB\xD7/\xD5\xDF\xD5\xD3:E\xEE\xF7\xCD\x1FA\xAC?\x14\xD8\xBE\xB3}\xAFj\xF9\xED\x7FQ~\t\x9B\xE9\xF7:\xD6\xBF\x17\xD9\n\xBA\xBAr\xE4\x7F0\xFE\xE9\xFA\xFD\xFD\x8F7kscWg\xBBT\xC3\x94\xEE\xB9r?/\xB2=\xFC\xDE\xCBZ\xC4V\xE4\xE0\xE1g\x96\xC7\xD1V\xEDV\xFC[]\xFA\x8F-\e\xDF\x7F\xD6%\x85'd~u<\x92a\xF9\xB8\x9BQ\x86\xE5\x13\x90-\xFA\x9D\xF7\xFB\x15\xA0\xEA\x14eE\xF7\xDF\xEC\xB9\x1Cme\x9A\x85\xBFC\xA4\xFF\xBCg\xFB1\xF1\xC7K\xD6I\x93{\xFB&H\xF5v\xF7\xB5L\x95\xFB\x93\xF6S\x90\xF5\xC7\x0E\xB6\xEFR\xCFj;\xA7\xC8\x1Fl~Tu+rI\xF5\xF9\xB8\xB5V\x1CK\xD8~\xF3~_\xCB*\xF3;\x89\xAD\xA4\xAB\xAB\xB5C\xBE\xAB\xA3\xBB\xA2A\xEA\xC7\xD2\xBF\x19\x7Ff\xFD\xF9\xCC\xDAX\xDF\xDD\xD6\x05q _\xF9|6\x99\xDF\x95\xF3\xD9\xE5\x16\xB8O\x9D9\xE3?\x0F\xE7.\xAE]\xDC\x9B'\xF1\xF0\x001/@\x80\x01\x00J\xBC\xBFN\n",
     @hash={:Filter=>:FlateDecode, :Length=>464, :Subtype=>:Type1C},
     @udata=nil>}}

由于Adobe glyphlist.txt(在pdf-reader/lib/pdf/reader/glyphlist.txt处复制)仅包含summation,而不是summationtextsummationdisplay@differences不在&#39 ; t应用于@mapping中的PDF::Reader::Encoding#differences=@state.current_font.to_utf8(1)无法获取正确的字形(它将字形码作为后备字段返回,这就是为什么我最终得到\u0001 )。即PDF字体对象内的字体映射差异应该(根据我的理解)按名称在主字形列表上引用字形,但这两个不匹配。

我错过了什么?如果summationdisplaysummationtext不在Adobe glyphlist.txt上,其他PDF阅读器如何正确呈现此字体?

1 个答案:

答案 0 :(得分:1)

这是使用自定义编码和非标准字形名称定义字体子集。此外,它不包含自定义编码的ToUnicode反向映射。

PDF-32000 Specification涵盖了这种情况:

  

9.10文本内容的提取

     

9.10.1一般

     

...

     

当提取字符内容时,如果根据符合本标准的读者已知的标准字符集识别字体的字符,则符合本标准的阅读器可以轻松地将文本转换为Unicode值。如果字体使用标准命名编码或字体中的字符由标准字符名称或已知集合中的CID标识,则可能发生此字符标识。 9.10.2,“将字符代码映射到Unicode值”,详细描述了将字符代码映射到Unicode值的整体算法。

     

如果没有以这些方式之一定义字体,仍然可以显示字形,但如果没有其他信息,则无法将字符转换为Unicode值:

     

•此信息可作为字体词典中的可选ToUnicode条目提供(PDF 1.2;请参见9.10.3,“ToUnicode CMaps”),其值应为包含一种特殊类型的CMap文件的流对象,该文件可映射字符代码为Unicode值。

pdf-reader似乎确实符合上述要求。有/summationdisplay映射到\u0001的自定义子集编码。有足够的信息可以渲染,但不能将字体反向映射回Unicode。