我尝试使用希伯来语文本生成PDF文本文件。
我设法产生了一个简单的文件。文件在这里
该文件会在Adobe Acrobat Reader中完美打开,显示字符串“אאאווותתת”。它也可以在IE中完美打开。
问题是其他查看器显示得很糟糕:Google Chrome / Google文档显示了所有“ו”的情况(也就是说,三个字母“ו”消失了!)
Mozilla Firefox的显示效果很差,多次在页面上的奇数处显示一些字母...
我究竟做错了什么??文件中有什么问题?
我知道这是一个棘手的问题。
任何帮助将不胜感激...
PDF中的字体是PDF对象-Font
字典,其中包含许多参数和子字典,这些参数和子字典对于选择字形,显示它们并将字符代码转换为逻辑(Unicode)表示形式是必需的,以进行内容提取。用外行术语表示的字体(如我们所看到的* .ttf或* .pfb文件)被称为字体程序,可以是嵌入式程序也可以是外部程序,并且由Font
对象的子词典之一引用。
Fonts
分为两组:
Font
对象定义(通过预定义名称或显式),或者在特殊情况下,根据查看器应用程序根据定义的规则构造。有问题的文件不包含简单字体,我们将不再进一步讨论它们-但是请注意,过于简单的描述甚至还没有开始反映现实生活中的任何复杂性。
CIDFont
,类似于简单字体的编码,该CMap
对象将字符代码映射到字符选择器,在PDF中,该字符选择器始终是CIDs
-整数,最大为65536。现在,字符选择器(CID
)通常不直接用于从字体程序中选择字形。对于CIDFont
的CIDFontType2
类型,它的字典中包含CIDToGIDMap
的条目,即,很明显,映射CID
到字型标识符。这些GIDs
是,在最后,用于选择从嵌入字形字体程序(对于CIDFontType2
字体,是一个的TrueType字体程序(不要混淆Font
的对象的TrueType Subtype
))。
Font
对象可以具有ToUnicode
将CID映射到Unicode值以进行索引,搜索和提取的资源。它被称为ToUnicode Cmap
(因为它遵循类似的语法),但不应与CMap
上面提到的对象混淆。
在我所说的简单情况下(我认为是明智的决定),它CMap
是预定义的Identity-H名称,CIDToGIDMap
是预定义的Identity名称,因此,从字符串中提取的字符代码(表示操作符的文本的参数)始终为2个字节的数字,可以有效地直接从嵌入式TrueType程序中选择字形。根据我的经验,这是最常见的场景,事实就是如此,测试通用软件时就是这种情况。
但是,有关文件的情况并非如此。
在我们的文件中,显示操作符的文本有效地获得了以下字符串:
0x000a 0x000a 0x000a 0x20 0x0020 0x0020 0x0020 0x20 0x0025 0x0025 0x0025
当然没有“组”,它们在这里是因为我创建了它们,基于CMap
它们包含两个范围:
<20> <20>
<0000> <19FF>
长话短说,如果我们查找字符代码CMap
并获取CID,然后查找CIDCIDToGIDMap
并获取GID,然后以嵌入式David-Bold字体查找GID并获取Unicode值,则此表
Code CID GID Unicode Name
0x000a 10 180 05EA tav
0x0020 32 159 05D5 vav
0x0025 37 154 05D0 alef
0x20 228 03 0020 space
现在我们有足够的信息来推测,是什么使查看器应用程序感到困惑
在我的第一次尝试中,我建议将其32
代码(和CID
)用于非空格字符(请参见上面的注释)。这个假设是基于几年前的一个案例,当时(较旧的版本)Acrobat没有在0x20
代码中显示字符,而是在字符串的末尾-假设它space
实际上是,根据编码矢量(简单字体),它是另一个字符。
我改变了这个:
0x0020
以0x0004
在内容流;CIDToGIDMap
进入GID = 159;Widths
CID = 4数组中的值到'vav'宽度;ToUnicode cmap
进行了相应的调整。<0020> 32
字符串CMAP
-未反映在文件中,以评论形式链接)是的,它确实有帮助,但是不幸的是,一些观众仍然拒绝遵守规范。
然后我想,可能是可变字符代码宽度是问题所在。
我返回到原始文件并更改了此内容:
0x20
以0x00e4
在内容流;<20> 228
以<00e4> 228
中CMAP
;codespacerange
<20> <20>
在CMAP
删除;codespacerange
<20> <20>
中ToUnicode Cmap
已删除。该文件似乎在所有查看器中均可完美打开,下面的原始问题和评论中提到了该文件。奇迹般地,0x0020
编码并且32
CID
不干涉。
我认为结论可以是:
在当前状态下,不建议PDF创建者在字体编码(CMAP
)中混合使用单字节和双字节代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句