如果没有嵌入字体,PDF 是否仅限于 4281 个字符(AGL)?如何显示更多字形



Adobe Glyph List (AGL) 被描述为

是 4,281 个字形名称到一个或多个 Unicode 字符的映射。

据我了解/Adieresis这些是 PDF 名称,允许指定相应的 unicode 字符U+00C4,如果我的理解正确,这 4,281 个名称可用于指定映射,就像这里为页面/Resources字典中名为/F1的字体所做的那样:

<<
/Type /Page
/Resources <<
/Font <<
/F1 <<
/Type /Font    
/Subtype /Type1
/BaseFont /Times-Roman
/Encoding <<
/Differencs [ 1 /Adiaresis /adiaresis ] 
>>
>>
>>
>>

我无法理解的关键问题是,通过/Differences数组和预定义的 AGL 名称,我只能使用基本/内置/标准 PDF 字体集中的 4,281 个字形/字符,不是吗?

基本上我要问的是,如果不将这些字形嵌入到生成的 pdf 中,显示包含未包含在这 4,281 个 AGL 字符中的任何字符的文本是否正确?

我也感到困惑的是,PDF 中有一个/toUnicode功能允许将嵌入字体的字形/cmap 与它们应该表示的 unicode 字符相关联(因此有一些关于"unicode"的想法),但我似乎找不到使用任何合理的 unicode 代码点或半途而废的编码(即 UTF-8)来使用 PDF 中的内置字体的方法。

那么我的假设是否正确,即如果不生成要嵌入 pdf 文件的字体,文本最多只能来自这 4,281 个字符的集合?

为了支持 Unicode 基本多语言平面中的所有 65,557 个字符,需要生成一种包含文本中使用的字形的字体,因为除了那 4,281 个 AGL 字形之外,似乎没有办法引用这些 unicode 字符,对吗?

赋予动机

在PDF中有一种与HTML5等效的方法会很好<meta charset="utf-8">.允许文本以一个简单的兼容编码进行 unicode 编码,而不必处理复杂的事物,如 CID/GID/Postscript 字形名称等。

这个答案首先讨论在差异数组中使用非 AGL 名称以及复合字体的更全面的编码。然后,它讨论查看器实际必须具有哪些字体可用。最后,它会根据您的赏金优惠随附的澄清来考虑所有这些。

AGL 名称和差异数组

首先让我们考虑一下您原始问题的焦点,

我无法解决的关键问题是,通过/Differences 数组和预定义的 AGL 名称,我只能使用基本/内置/标准 PDF 字体集中的 4,281 个字形/字符,不是吗?

基本上我要问的是,如果不将这些字形嵌入到生成的 pdf 中,显示包含未包含在这 4,281 个 AGL 字符中的任何字符的文本是否正确?

即您的假设是只有这 4,281 个 AGL 字形名称才能在简单字体的编码条目的Differences数组中使用。

事实并非如此,您也可以使用在 AGL 上找不到的任意名称。 例如,使用此字体

7 0 obj
<<
/Type /Font
/Subtype /TrueType
/BaseFont /Arial
/FirstChar 32
/LastChar 32
/Widths [500]
/FontDescriptor 8 0 R
/Encoding 9 0 R
>>
endobj
8 0 obj
<<
/Type /FontDescriptor
/FontName /Arial
/FontFamily (Arial)
/Flags 32
/FontBBox [-665.0 -325.0 2000.0 1040.0]
/ItalicAngle 0
/Ascent 1040
/Descent -325
/CapHeight 716
/StemV 88
/XHeight 519
>>
endobj
9 0 obj
<<
/Type /Encoding
/BaseEncoding /WinAnsiEncoding
/Differences [32 /uniAB55]
>>
endobj

指令

( ) Tj

在安装了 Arial (ArialMT.ttf) 的系统上显示了一个 ꭕ("带有左衬线低的拉丁小写字母 CHI"U+AB55,如果我没看错的话,它不在 AGL 上)。

因此,要显示任意字形,您只需要一个您知道的字体,其中包含该字形,并且您知道的名称可供相关 PDF 查看器使用。名称不必是 AGL 名称,它可以是任意的!

复合字体的编码

此外,您通常甚至不需要枚举所需的字符,只要所需的字符与复合字体的同名编码相同!

这里的编码应该是

预定义 CMap 的名称,或包含将字符代码映射到字体编号和 CID 的 CMap 的流。如果后代是类型 2 CIDFont,其关联的 TrueType 字体程序未嵌入到 PDF 文件中,则编码条目应为预定义的 CMap 名称(请参见 9.7.4.2 "CIDFonts 中的字形选择")。

在预定义的CMap中,有许多CJK的。只要有问题的查看器可以访问匹配的字体,您就可以使用具有这种编码的复合字体来访问许多 CJK 字形。

查看器必须具有哪些字体可用?

因此,如果相关查看器具有适当的可用字体,则无需嵌入字体程序即可显示任何字形。但是查看器有哪些字体可用?

通常查看器将允许访问在其运行的操作系统中注册的所有字体,但严格来说,它只需要具有很少的字体可访问,支持 PDF 1.0 到 PDF 1.7 文件的 PDF 处理器只需要知道所谓的标准 14 字体,纯 PDF 2.0 处理器不需要知道。

规范的附录 D 阐明了要支持的字符范围:

D.2 "拉丁字符集和编码"中列出的所有字符应由支持 PDF 1.0 至 1.7 的 PDF 处理器支持 Times、Helvetica 和 Courier 字体系列,如 9.6.2.2 "标准类型 1 字体(标准 14 字体)(PDF 1.0-1.7)"中所列。

D.4 "符号集和编码" 和 D.5 "ZapfDingbats set and encoding" 描述了符号和 ZapfDingbats (ITC Zapf Dingbats) 字体程序的字符集和内置编码,它们属于标准的 14 种预定义字体。

D.2本质上是一个描述StandardEncoding,MacRomanEncoding,WinAnsiEncodingPDFDocEncoding的表格。这些都是非常相似的单字节编码。

D.4 和 D.5 包含一个表,每个表描述其他单字节编码。

因此,您实际上可以从PDF 1.x查看器中获得的只是这些不到1000个字符的字符!

(您在对另一个问题的回答的评论中对此感到疑惑。

关于你的澄清

在赏金提议随附的文字中,您表达了对

被启用以创建一个能够生成 PDF 文件的"无装饰"程序,其中输入数据是 UTF-8 Unicode 字符串。 "没有多余的装饰"是指这样一个事实,即这样的软件理想情况下能够跳过处理字体 porgam 数据(例如创建子集字体 pogram 以包含在 PDF 中)。

如上所述,您可以通过许多简单字体的自定义编码或复合字体的更全面的命名编码来执行此操作。如果您知道目标 PDF 查看器具有这些可用字体,那就是!

草拟一种方法,实际上允许至少通过"UniCNS−UTF16−H"引用的 Adobe-GB1 字符集中的字符在 pdf 查看器中呈现,而 pdf 文件没有嵌入任何字体程序来实现这一点。

"UniCNS−UTF16−H"恰好是复合字体允许的预定义编码之一。因此,只要查看器具有可访问的适当字体,您就可以使用此编码的复合字体,而无需嵌入字体程序。就Adobe Reader而言,这通常相当于安装了扩展亚洲语言包

使用其他任何内容的限制 WinAnsiEncoding, MacRomanEncoding, MacExpertEncoding 与这 14 种标准字体。

如上所述,您只能指望在任意PDF 1.x查看器中肯定可用的字形少于1000个。在纯PDF 2.0查看器中,您实际上甚至不能指望这一点!


以上规格引用来自ISO 32000-2;类似的要求已经在ISO 32000-1中找到。

如果没有嵌入字体,PDF 是否仅限于 4281 个字符(AGL)?

不。尽管您应该嵌入字体以帮助确保 PDF 在任何地方看起来都相同。

基本上我要问的是,如果不将这些字形嵌入到生成的 pdf 中,显示包含未包含在这 4,281 个 AGL 字符中的任何字符的文本是否正确?

有可能是的,尽管理想情况下您会坚持使用"标准"编码,例如排序之一。有关这些内容,请参阅 PDF 规范中的"预定义 CMaps"。

如果您开始对编码进行更改,例如使用差异,那么您会使 PDF 处理程序的运行时字体替换变得更加困难。

关于/ToUnicode,这只是为了文本提取,与渲染无关。如果您坚持使用上面建议的标准编码,则不需要这样做。

PDF 中没有固有的 4,281 字体字形限制。 我想你有点困惑,你不必在PDF中嵌入字体。 除了所有PDF查看器都应该能够处理的标准14种字体外,PDF软件还将查找未嵌入时安装在系统上的字体,因此,如果没有嵌入字体,则完全无法显示字形。

如果基本编码不反映字体中的内容,则可以使用 Differences 数组定义不同的编码。

ToUnicode在文本提取与文本显示方面发挥作用。

最新更新