【问题标题】:Read Japanese characters in a PDF file读取 PDF 文件中的日文字符
【发布时间】:2014-04-21 07:00:04
【问题描述】:

我有以下命令:

[1010]TJ

我知道它在 Hex 部分隐藏了日语,因为这是 PDF 中唯一的内容,而这一行是 pdf 文件中一个单独页面的唯一内容流中。

问题是无论我如何尝试解码这些十六进制字符串,我最终都会得到乱码,我已经将这些十六进制字符串解码为字节,并尝试逐字应用我能找到的每个字符集,但我仍然得到乱码。

(也许我很绝望,因为我知道它可能无法正常工作) 我也尝试过另一种方法,在 Android 上进行测试,我可以导入 pdf 日文文本(从资源中加载),在调试时我可以在 String 实例的值中看到真正的日文文本,我再次尝试应用所有字符集,只为整个文件生成 4-6 个匹配的十六进制字符,但再次......什么都没有。

我实际上不需要字形,我会选择正确的文本...

可能是文本本身是由字符集编码以外的东西编码的吗? 谁能指出我正确的方向?

=== 更新 ===

好的,所以我发现有一个额外的“加密”,Identity-H,我有 read here,你需要一个 /ToUnicode 映射,我似乎在文件中找不到。

让我抓狂的是其他 PDF 查看器可以显示 PDF,但我不知道如何!

再一次,任何骨头都会很好......我会去寻找碎片:)

谢谢,

亚当。

对于某些文件上下文:

...
10 0 obj
    << 
    /Type /Page 
    /Parent 7 0 R 
    /Resources 11 0 R 
    /Contents 16 0 R 
    /MediaBox [ 0 0 595 842 ] 
    /CropBox [ 0 0 595 842 ] 
    /Rotate 0 
    >> 
endobj
11 0 obj
    << 
    /ProcSet [ /PDF /Text ] 
    /Font << /TT2 13 0 R /G1 12 0 R >> 
    /ExtGState << /GS1 19 0 R >> 
    /ColorSpace << /Cs6 15 0 R >> 
    >> 
endobj
12 0 obj
    << 
    /Type /Font 
    /Subtype /Type0 
    /BaseFont /Ryumin-Light-Identity-H 
    /Encoding /Identity-H 
    /DescendantFonts [ 18 0 R ] 
    >> 
endobj
13 0 obj
    << 
    /Type /Font 
    /Subtype /TrueType 
    /FirstChar 32 
    /LastChar 32 
    /Widths [ 278 ] 
    /Encoding /WinAnsiEncoding 
    /BaseFont /Century 
    /FontDescriptor 14 0 R 
    >> 
endobj
14 0 obj
    << 
    /Type /FontDescriptor 
    /Ascent 985 
    /CapHeight 0 
    /Descent -216 
    /Flags 34 
    /FontBBox [ -165 -307 1246 1201 ] 
    /FontName /Century 
    /ItalicAngle 0 
    /StemV 0 
    >> 
endobj
15 0 obj
    [ 
    /ICCBased 20 0 R 
    ]
endobj
16 0 obj
    << /Length 2221 /Filter /FlateDecode >> 
        stream
        ...
                [<0e0f0a52030d030e0ce5030f0744030f>10<030d>10<0cd4>]TJ
        ...
                <00e700e700e700e700e700e700e700e700e700e700e700e700e700e700e700e700e700e700e700e700e700e700e700e7>Tj
        ...
                <030e030d0a48064403740353035a039408030ebd074807c1036e0358039304e10c8802a2074807c10cd40e8a030e030d02a303770a2a0a100374036d034d036f00e7>Tj
        ...
    endstream
endobj
17 0 obj
    << 
    /Type /FontDescriptor 
    /Ascent 723 
    /CapHeight 709 
    /Descent -241 
    /Flags 6 
    /FontBBox [ -170 -331 1024 903 ] 
    /FontName /Ryumin-Light 
    /ItalicAngle 0 
    /StemV 69 
    /XHeight 450 
    /Style << /Panose <010502020300000000000000>>> 
    >> 
endobj
18 0 obj
    << 
    /Type /Font 
    /Subtype /CIDFontType0 
    /BaseFont /Ryumin-Light 
    /FontDescriptor 17 0 R 
    /CIDSystemInfo << /Registry (Adobe)/Ordering (Japan1)/Supplement 2 >> 
    /DW 1000 
    /W [ 231 [ 500 ] ] 
    >> 
endobj
19 0 obj
    << 
    /Type /ExtGState 
    /SA false 
    /SM 0.02 
    /TR2 /Default 
    >> 
endobj
20 0 obj
    << /N 3 /Alternate /DeviceRGB /Length 2572 /Filter /FlateDecode >> 
    stream
    ...
    endstream
endobj
...

【问题讨论】:

  • 我发现文本中有一个 Identitiy-H“编码/加密”,但文件中的 /ToUnicode 映射没有任何证据......任何指针?跨度>
  • 您显示的十六进制八位字节似乎不是标准的 UTF 或 ANSI 字符集编码,它包含 ASCII 可视范围之外的八位字节(0x00、0x03、0x0E 等),所以有可能涉及到您尚未考虑的另一层编码。
  • 您需要一个 /ToUnicode 映射,我似乎在文件中找不到它。让我抓狂的是其他 PDF 查看器可以显示 PDF,而我不知道如何显示! - 您需要 ToUnicode 来规范地检索 PDF 表示的 Unicode 字符,而不是 显示 PDF。要显示它,您只需要了解字体。在您的情况下,/Registry (Adobe)/Ordering (Japan1)/Supplement 2 请查看 Adob​​e 技术说明 #5078-b Adobe-Japan1-2 Character Collection for CID-Keyed Fonts
  • mkl, "Show the DPF" 是一个糟糕的词选择(沮丧...),我已经将十六进制与字体进行了比较,你是对的,这些是我需要的字体!所以你说的是我需要将十六进制值映射到文件中的字符....如果我做对了,这应该是我麻烦的关键:sourceforge.net/projects/cmap.adobe/files/… 问题是......我该怎么做所有这些数据的意义?开始新的冒险:)

标签: pdf text unicode hex


【解决方案1】:

由于这里的大多数想法基本上是正确的,它们并不完整也不准确,所以:

  • /ToUnicode 可以出现在 PDF 文件中,但不是必须的!!!
  • 有多种语言的外部、预定/预定义 CMap,here

在错误的地方挖了这么久真是令人沮丧,我已经将 PDF 分成小块并浏览了文件中的所有流,但没有运气找到这张地图,因为它不在文件中!

我希望这可以省去其他人的麻烦......

【讨论】:

    【解决方案2】:

    这是你的问题:

    我发现有一个额外的“加密”,Identity-H,我在这里读到你需要一个 /ToUnicode 映射,我似乎在文件中找不到它。

    这表明文本字符串中的两字节十六进制代码是原始字体文件中的直接字形索引。在字体文件中搜索 Unicode 字符映射(其 cmap 条目之一);这将提供从字形索引到 Unicode 的链接。

    请注意,字形索引可能立即转换为 Unicode 代码点。 GSUBGPOS OpenType 表可能已将一个或多个 Unicode 字符作为输入,并用输出字符串中的另一个字形替换它们。原始创建者也有可能(但不太可能)手动插入原始字形。

    【讨论】:

      猜你喜欢
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 2019-11-19
      • 2014-10-17
      • 2016-07-01
      相关资源
      最近更新 更多