对于我正在编写的一份相当大的文档(超过 100 页),我运行pdffonts
检查字体是否已适当嵌入。输出如下:
C:\>pdffonts 主要.pdf 名称 类型 emb sub uni 对象 ID ------------------------------------ ----------------- --- --- --- --------- PEUMGT+Utopia-Regular Type 1C 是 是 否 10 0 QIAYNS+Utopia-Bold Type 1C 是 是 否 8 0 XUFKIZ+Utopia-Italic Type 1C 是 是 否 61 0 CVIUTI+Fourier-Math-Letters-Italic Type 1C 是 是 否 270 0 YJVFRW+Fourier-Math-Symbols Type 1C 是 是 是 282 0 LPRTGE+Fourier-Math-Extension Type 1C 是 是 是 332 0 UYVFMY+Fourier-Math-Letters-Bold-Italic Type 1C 是 是 否 592 0
我一直在使用该\include{fourier}
软件包,以便获得我非常喜欢的 Fourier 字体,无论是用于数学还是日常使用。我从字体输出表中看到,我也有一些 Utopia 字体,这些字体来自 Adobe,如 Fourier 软件包文档中所述。我有三个问题:
我想知道表格中字体名称前的“随机”字母是什么意思(例如,第一行有 PEUMGT)。
我想学习如何更好地解释字体输出表。在倒数第二列的最后一行中,我们有数字
592
。这是什么意思?在哪里可以找到有关该
pdffonts
命令的更多信息?
答案1
据我所知,问题 1+2 尚未得到完全解答...
1.
“我想知道表格中字体名称前的“随机”字母是什么意思(例如第一行有 PEUMGT)。”
- 这些字母是原始字体名称的前缀,它们表示该字体是嵌入的,但不是满的该字体可用的字形集,但只能作为子集。根据 PDF 规范,与使用相同完整字体的其他子集字体名称相比,字体名称前缀确实应该是随机的和唯一的。
2.
“我想学习如何更好地解释字体输出表。在倒数第二列的最后一行,我们看到了数字592
。这是什么意思?”
- 正如 Herbert 所说,PDF 文件包含已编号的对象(并具有“代”子编号,在大多数情况下为 0)。如果您想查找对象 592 代 0 的确切 PDF 代码,您应该在 PDF 中搜索以行 开头
592 0 obj
、以行 结尾的部分endobj
。其间的所有内容都定义了此对象。但是,可能会引用其他一些对象:如果您找到字符串,表示691 0 R
您知道要查找对象 691,现在以与您最初查找对象 592 相同的方式查找代 0。 - 如果您想知道您的
592
对象在 PDF 中的哪个位置使用以及在多少个位置使用,请搜索所有出现的592 0 R
...
更新:
3.
列中的值uni
代表什么含义?(实际上,这不是原帖作者要求的,而是我自己添加的,因为它符合上下文……:)
列中的值
uni
表示相关字体是否附带表格/ToUnicode
(如果存在,则为 PDF 中的单独对象)。此表提供从“字符代码”到 Unicode 字符或代码点的反向映射。如果没有正确有效的
/ToUnicode
表格,任何文本提取都很可能会因Custom
编码字体而失败,并导致无法读取的垃圾:pdftotext
将无法按预期工作;- 屏幕阅读器将无法向有需要的用户大声朗读 PDF 内容;
- 复制粘贴无法按预期工作。
您可以通过在文本编辑器中打开任何 PDF 来测试这一点。如果您在其中找到字符串
/ToUnicode
,请将其更改为/toUnicode
。(大写字母的这种变化将使区分大小写的关键字不再可用。)之后,您的 PDF 仍将显示相同的内容,但文本提取将不再起作用(对于禁用的表格所/ToUnicode
使用的字体)。[您现在可能会问:文本如何在查看器中正确显示?原因是向前(Unicode) 字符或代码点 (到要为其绘制的字形) 的映射使用不同的机制...参见点4。
4.
新版本会pdffonts
显示一个附加列,encoding
如下所示:
name type encoding emb sub uni object ID
-------------------------- ---------- ---------------- --- --- --- ---------
UBYABV+CMR10 Type 1C Builtin yes yes no 8 0
列中的值encoding
代表什么含义?(问题也是我添加的:)
这‘编码’字体实际上代表了提到的前向映射(参见点3) 从“字符代码”转换为字体内的字形 ID,以便 PDF 渲染器知道如何绘制代表字符代码的特定字形。(笔记,此处的技术术语“字符代码”与“字母”或“字符”不同。在 PDF 文本对象中表示字母“a”的“字符代码”可能是“z”,也可能是其他任何内容。)
字体编码有多种机制:
- 根据编码(对于类型 1字体):其中包括标准编码,温控器和MacRoman编码。这些是 PDF 阅读器所熟知的,不需要嵌入到 PDF 中。
- 风俗编码(对于类型 1字体):这些是基于命名的基本编码,但通过
/Differences
向最终字体编码添加数组进行修改。 - 身份-H,第五人格编码:CID 字体类型的标准编码(字体可包含远多于 Type 1 字体所能包含的最大 256 种不同字形)。
- 内置编码:每个字体程序(Type 3 字体除外)都必须包含内置编码。
那么为什么 PDF 并不总是使用“内置”编码呢?因为它们并不总是嵌入满的字体程序。有时它们仅嵌入 PDF 文档中实际出现的字形子集。
答案2
从man pdffonts
DESCRIPTION
Pdffonts lists the fonts used in a Portable Document Format (PDF) file along with various information for each font.
The following information is listed for each font:
name the font name, exactly as given in the PDF file (potentially including a subset prefix)
type the font type -- see below for details
emb "yes" if the font is embedded in the PDF file
sub "yes" if the font is a subset
uni "yes" if there is an explicit "ToUnicode" map in the PDF file (the absence of a ToUnicode map doesn't necessarily
mean that the text can't be converted to Unicode)
object ID
the font dictionary object ID (number and generation)
PDF files can contain the following types of fonts:
Type 1
Type 1C -- aka Compact Font Format (CFF)
Type 3
TrueType
CID Type 0 -- 16-bit font with no specified type
CID Type 0C -- 16-bit PostScript CFF font
CID TrueType -- 16-bit TrueType font