1

我正在尝试阅读一堆 PDF,然后只提取文本。对于使用 FlateDecode 的示例文本的一半,我只使用了gzuncompress,然后我得到了一些我可以解析以获取文本的内容:

Tw [(remains an unresolved theoretical and pragmatic conundr)]

但在gzuncompress()我回来后的其他时候:

TD [(\002\016\032)-233.5 (\017\004\t/+\013\r\016\013\004\024\f)-233.5 
    (\b\002\017\004\032)-233.5 (\004;\024\t\002\016\002\f\n\r\016\017)-233.4
    (\r/)-233.5 (\013\022\002\023\n\017 \002\f\n\013)-233.4
    (\t\004\002\032\004\023\017\022\n\024)-233.5 (1\004\020\003\020\033)-233.5
    (\001\022\002 \n\023)]TJ

我很确定这是文本,因为我无法从 PDF 中获取任何其他文本,并且它位于BT ... ET

第二种格式是什么,如何将其转换为可读的格式?

4

1 回答 1

4

您需要为文件中每一行文本数据的字体描述符找到 CMap。它看起来像:

16 0 obj 
    << /Length 433 >>
    stream 
    /CIDInit /ProcSet findresource begin 
    12 dict begin b
    egincmap 
    /CIDSystemInfo 
    << /Registry (Adobe) 
    /Ordering (UCS) 
    /Supplement 0 
    >> def 
    /CMapName /Adobe−Identity−UCS def 
    /CMapType 2 def 
    1 begincodespacerange 
    <0000> <FFFF> 
    endcodespacerange 
    2 beginbfrange 
    <0000> <005E> <0020> 
    <005F> <0061> [<00660066> <00660069> <00660066006C>] 
    endbfrange 
    1 beginbfchar 
    <3A51> <D840DC3E> 
    endbfchar 
    endcmap CMapName currentdict /CMap defineresource pop end end endstream 
endobj

让我们将此示例转换为表格形式:

+-----------+----------+----------+----------------------+--------------+
| write hex | or ascii | or octal |  with substitution   | and will see |
+-----------+----------+----------+----------------------+--------------+
| <5f>      | _        | \137     | U+0066 U+0066        | ff           |
| <60>      | `        | \140     | U+0066 U+0069        | fi           |
| <61>      | a        | \141     | U+0066 U+0066 U+006c | ffl          |
+-----------+----------+----------+----------------------+--------------+

因此,如果您将在当前 CMap 的字体描述符下看到文本:

TD[(\137\140\141)]TJ === fffiffl

此示例 CMap 包含一个替换。对于单个字符:

+-----------+----------+--------------------+-------------+
| write hex | or octal | means in UTF-16BE  | and Unicode |
+-----------+----------+--------------------+-------------+
| <3a51>    | \35121   | <D840DC3E>         | U+2003e     |
+-----------+----------+--------------------+-------------+ 

而这个替换是TD[(\35121)]TJ ===

于 2013-10-30T16:29:11.373 回答