PDF文本字符串的编码

PDF文本字符串的编码,pdf,Pdf,我正在为PDF(文本提取)解析器工作 当页面需要进行平面解码(从zlib压缩)时,我的代码能够解压缩内容流,然后我有如下输出(流对象): BT 56.8 721.3 Td /F2 12 Tf [<01>2<0203>2<04>-10<0503>2<04>-2<0506070809>2<0A>1<0B>]TJ ET BT 56.8 721.3 Td /F2 12 Tf [22-102-221]TJ

我正在为PDF(文本提取)解析器工作

当页面需要进行平面解码(从zlib压缩)时,我的代码能够解压缩内容流,然后我有如下输出(流对象):

BT
56.8 721.3 Td 
/F2 12 Tf
[<01>2<0203>2<04>-10<0503>2<04>-2<0506070809>2<0A>1<0B>]TJ
ET
BT
56.8 721.3 Td
/F2 12 Tf
[22-102-221]TJ
ET
我对字符串数组(TJ的操作数)感兴趣

这个数组中似乎包含多个十六进制编码的字符串,但相应的十六进制值没有意义。相反,它看起来像一个序列010203。。。有点像lz77压缩

  • PDF有多个压缩级别吗
  • 如何从上面的字符串数组中获取纯文本
      阿披实

      这远不是一个简单的问题,不幸的是,它表明您还没有阅读PDF规范。你应该这样做

      您可以在此处下载Acrobat SDK:

      其中一部分是PDF规范,它是一个非常重要的文档,解释了PDF的来龙去脉(包括您问题的答案)


      简而言之,您看到的不是阅读文档的替代品,而是/F2 12 Tf命令设置的字体编码中的字符值,该命令设置了后续编写文本时使用的特定字体。

      在您开始这样一个雄心勃勃的项目之前,您应该熟悉完整的。请注意:这是一个756页的文档,它引用了大约90个其他文档,它声明这些文档也是PDF的“规范性”文档

      您将了解到,为了将PDF源代码转换为文本内容,必须反向应用字体使用的编码。可使用5种规范定义的标准编码:

    • 标准编码
    • 宏编码
    • winansioncoding
    • PDFDocEncoding
    • MacExpertEncoding
    • 除此之外,还可以有一个
      自定义编码
      (当嵌入字体是一个子集时,它将起作用,并且不包含字体定义的所有字形,而只包含文档所需的字形)。如果PDF中定义了
      /ToUnicode
      表,则只能反转CustomEncode-d文本。只有这样,您才能将编码字符反向映射到字符名

      您还将了解到,可用于显示文本字符串的运算符不仅有一个,还有四个:

    • Tj
      :“显示文本”
    • TJ
      :“显示文本,允许单个字形定位”
    • :“移动到下一行并显示文本”
    • :“设置单词和字符间距,移动到下一行并显示文本”
    • 此外,有三种不同的方式来表示文本字符串。这里给出了字符串“string”的示例:

    • (字符串)
      :在括号内使用标准的可打印ASCII字符(仅适用于拉丁/ASCII文本部分)
    • (\163\164\162\151\156\147)
      :使用八进制字符代码(也在括号内),如规范文件“附录D(规范性)字符集和编码”中所列
    • :在尖括号内使用十六进制编码字符代码
    • 文本提取器的问题如下:

    • 可以混合使用可打印ASCII字符(
      1.
      以上)和八进制字符代码(
      2.
      以上)。以下所有内容也是字符串“string”的“合法”表示形式(列表不完整!):

    • 使用十六进制编码字符代码(
      3.
      )也不是直接的,因为以下所有表示形式都是等效的:

      <73 74 72 69 6E 67> TJ
      
      <73 7472 696E67> TJ
      
      <7 374 7 269 6E 67>TJ
      
      <73   74    72696E 67> TJ
      
      <73
        74 7
        2 69 6E 67>
      TJ
      
      • BT
        ET
        表示显示部分的文本的开头和结尾

      • 56.8 721.3 Td
        将当前点定位到坐标“水平方向56.8点,垂直方向721.3点”

      • 12 Tf
        将字体大小设置为12点

      • /F1
        将要使用的字体设置为PDF文档中其他地方定义的字体。该字体还设置了字体编码(可能是
        /ToUnicode
        表)。字体编码将确定在文本字符串中看到特定字符代码时应绘制的字形

      • [22-102-221]TJ

      最后一部分可分为以下几部分:

      • 2
        是第一个字符代码。
        2
        是使用文本显示操作符
        TJ
        时允许的“单个字形定位”参数
      • 2
        是另外两个字符代码。
        2
        也是
        TJ
        的“单个字形定位”参数
      • -10
        是第四个字符代码。
        -10
        再次用于使用
        TJ
        的“单个字形定位”
      • 2
        是第五个字符的代码,
        是第三个字符的代码(以前使用过)。
        2
        用于“单个字形定位”
      • 等等
      单个字形定位:单个字形定位的工作原理如下:

      • 正数将下一个图示符向左移动(将图示符间距减小到下一个图示符)
      • 负数将下一个图示符向右移动(为下一个图示符添加更多空间)
      • 这些数字本身将被视为re
        <73 74 72 69 6E 67> TJ
        
        <73 7472 696E67> TJ
        
        <7 374 7 269 6E 67>TJ
        
        <73   74    72696E 67> TJ
        
        <73
          74 7
          2 69 6E 67>
        TJ
        
        BT
        56.8 721.3 Td 
        /F2 12 Tf
        [<01>2<0203>2<04>-10<0503>2<04>-2<0506070809>2<0A>1<0B>]TJ
        ET
        
        $ pdffonts sample.pdf
          name                      type          encoding     emb sub uni object ID
          ------------------------- ------------- ------------ --- --- --- ---------
          IADKRB+Arial-BoldMT       CID TrueType  Identity-H   yes yes yes     10  0
          SSKFGJ+ArialMT            CID TrueType  Custom       yes yes no      11  0