【问题标题】:/Differences dictionary for encode parsing issue in PDF/Differences 字典用于 PDF 中的编码解析问题
【发布时间】:2015-05-18 21:59:46
【问题描述】:

Type1 字体/Differences 编码在值的映射中使用字符串,例如 1 个字符被编码为“一”。它仅用于数字和特殊字符。

使用这些编码的标准方法是什么?

我应该如何从使用这种编码的 PDF 中解码字符串?

文件链接:http://www.filedropper.com/open

【问题讨论】:

  • 以上文档基本使用PDFLATEX。 tex.stackexchange.com/questions/33476/… 所以所有组合,如 fi、fl、ffl 等都将映射到它们对应的字形。如何判断 PDF 使用这种编码方式?

标签: pdf embedded-fonts


【解决方案1】:

这是您文件中的 /Differences 数组(老实说,您应该只是发布此内容,而不是链接下载页面):

/Differences [
    24 /breve/caron/circumflex/dotaccent/hungarumlaut/ogonek/ring/tilde
    39 /quotesingle
    96 /grave
    128 /bullet/dagger/daggerdbl/ellipsis...
]

它的工作方式是字体也有与之关联的编码(例如/MacRoman/WinANSI)。对于 Type 1 字体,字体中内置有编码。然后给定该编码的副本,您将差异应用到它。从数字开始(您的第一个是 24),您将条目 24-31 (包括)更改为 /breve/circumflex 等等。

在 Type 1 字体中,有一个名为 /CharStrings 的字典,它是字形名称与将呈现它的数据/代码的关联。例如,如果你得到一个代码为 26 的字符,你在你的编码数组(对于 Type 1 字体应该是一个 256 个元素的数组)中查找它,并应用差异,你会得到名称 /circumflex。然后在CharStrings 字典中查找它,提取字形数据并进行渲染。编码中不存在的任何字符都应设置为/.notdef,然后它将呈现一个表示未定义字符(通常是空框)的形状。

现在您的问题可能是,如何将这些字形名称转换为更有用的名称,例如 Unicode?​​p>

如果您查看附件 D,您会看到一组表,这些表定义了标准拉丁编码的字符集。您将制作一个将 Adob​​e 标准名称映射到 Unicode 的查找表。不幸的是,附件 D 中的表格并不完整。幸运的是,Adobe 有一个文件为您定义了所有这些here。该文件中有一个链接现在已经失效,但很可能它是指向here

【讨论】:

  • 这是您文件中的 /Differences 数组 - 实际上文件中有多个 Differences 数组。您仅显示的那个是唯一没有打包到对象流中的那个。
  • 我在这方面面临另一个问题。问题是我想使用“/fi”名称,因为该映射用于表示上述 PDF 中的单词“文件”,但是当我使用 Adob​​e 的标准字形列表时,它再次转换回该映射中给出的一些 unicode ,但我想用于数字、标点和非 ascii 字符。我的问题是如何决定何时使用 Adob​​e 提供的这些标准映射以及何时不使用它们。
  • 如果标准编码不能满足您的需求,请使用您想要的字符创建 /Differences 并在您的代码中跟踪它们。如果你想要连字,把它放在方便的地方。
  • 基本上这个pdf是使用上述编码的LaTex PDF。如何判断pdf是否使用这种编码?
【解决方案2】:

我应该如何从使用这种编码的 PDF 中解码字符串?

正如规范所解释的:

9.10.2 将字符代码映射到 Unicode 值

符合标准的读者可以使用这些方法,按照给定的优先级,将字符代码映射到 Unicode 值。带标签的 PDF 文档尤其应提供以下方法中的至少一种:

  • 如果字体字典包含 ToUnicode CMap,请使用该 CMap 将字符代码转换为 Unicode。

  • 如果字体是使用预定义编码 MacRomanEncodingMacExpertEncodingWinAnsiEncoding 之一的简单字体,或者具有编码其 Differences 数组仅包含取自 Adob​​e 标准拉丁字符集的字符名称和 Symbol 字体中的命名字符集:

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

    b) 在 Adob​​e Glyph List 中查找字符名称以获得对应的 Unicode 值。

  • 如果字体是复合字体... (不适用于您的情况)

如果这些方法无法生成 Unicode 值,则无法确定字符代码代表什么,在这种情况下,符合标准的读者可以选择他们选择的字符代码。

(ISO 32000-1)

因此,首先,您应该寻找 ToUnicode 映射。

如果没有(如您的示例文档),请使用编码(预定义或差异)。

如果您的代码未映射到编码中的正确内容,则根据规范无法确定字符代码代表什么

如果有问题的字体是嵌入的,您可能还需要通过解析嵌入的字体程序来解决问题,该程序可能包括它自己到 Unicode 的映射。

否则,您可以从这里开始猜测(或委托给 OCR)。


但你的假设

仅用于数字和特殊字符。

已经错了。如果您查看示例文档,例如文档第一页上使用的两种字体 F25F26 有一个 Differences 数组,如下所示:

0 /.notdef 1 /dotaccent /fi /fl /分数 /hungarumlaut /L斜杠 /lslash /ogonek /戒指 10 /.notdef 11 /短 /减 13 /.notdef 14 /兹卡隆 /zcaron /卡隆 /dotlessi /dotlessj /ff /菲 /ffl 22 /.notdef 30 /墓穴 /报价单 /空间 /感叹 /quotedbl /数字符号 /美元 /百分 /与号 /引用权 /parenleft /parenright /星号 /加 /逗号 /连字符 /时期 /削减 /零 /一 /二 /三 /四 /五 /六 /七 /八 /九 /冒号 /分号 /较少的 /平等的 /更大 /问题 /在 /一个 /乙 /C /D /E /F /G /H /我 /J /K /L /米 /N /O /P /问 /R /S /T /U /V /W /X /Y /Z /括号左 /反斜杠 /bracketright /asciicircum /下划线 /quoteleft /一个 /b /C /d /e /F /G /H /一世 /j /k /升 /米 /n /o /p /q /r /s /吨 /u /v /w /X /y /z /braceleft /酒吧 /braceright /asciitilde 127 /.notdef 130 /quotesinglbase /弗洛林 /quotedblbase /省略 /匕首 /daggerdbl /回旋曲 /千 /斯卡隆 /guilsinglleft /OE 141 /.notdef 147 /quotedblleft /quotedblright /子弹 /endash /emdash /波浪号 /商标 /scaron /guilsinglright /oe 157 /.notdef 159 /Ydieresis 160 /.notdef 161 /感叹号 /分 /英镑 /货币 /日元 /断条 /部分 /dieresis /版权 /ordfeminine /guillemotleft /逻辑非 /连字符 /挂号的 /长音 /程度 /正负 /twosuperior /三上级 /急性 /亩 /段落 /以周期为中心 /雪地拉 /一个上级 /ord阳性 /guillemotright /四分之一 /一半 /四分之三 /提问 /阿格雷夫 /急性 /非曲折 /阿蒂尔德 /阿迪埃西斯 /戒指 /AE /Ccedilla /埃格雷夫 /急性 /Ecircumflex /艾迪瑞斯 /伊格雷夫 /急性 /Icircumflex /异同 /Eth /Ntilde /奥格雷夫 /急性 /Ocircumflex /奥蒂尔德 /Odieresis /乘 /Oslash /乌格雷夫 /U急性 /Ucircumflex /尿失禁 /雅库特 /刺 /germandbls /严重 /a急性 /acircumflex /atilde /adieresis /戒指 /ae /ccedilla /egrave /急性 /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /奥格雷夫 /oacute /ocircumflex /otilde /除臭 /划分 /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /刺 /ydieresis

其中包含正常大写 /A../Z 和小写 /a../z 的映射> 字符也是。


顺便说一句,

Type1 字体 /Differences 编码在值的映射中使用字符串,例如 1 个字符被编码为“一”。

不完全正确,'/' 字符是相应映射值的一部分,例如/one,作为 PDF 对象,这些不是字符串,而是名称

【讨论】:

    猜你喜欢
    • 2014-06-23
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多