考虑这个示例代码:
\documentclass{article}
\usepackage{lipsum}
\begin{document}
\lipsum[1-4]
\end{document}
当我用 编译它latex
然后使用 时dvipdfm
,输出文件为 7893 字节。当我使用 时pdflatex
,输出 PDF 高达 20696 字节。当然,输出在视觉上彼此难以区分。
为什么会发生这种情况?pdflatex
里面放了什么东西会占用这么多空间?
作为参考,我在 Windows 7 上使用了最新的 MikTeX 2.9,并且无需任何额外的开关即可运行命令。
答案1
Martin Heller 给出了正确答案:dvipdfm
使用与不同的字体格式pdftex
。您可以通过将 PDF 文件加载到文本编辑器中来查看它。有时(嗯,通常),对象被压缩,您只能看到一些数据。因此,您要么需要内置解压缩算法,要么使用类似編輯解压缩对象(这就是我所做的):
qpdf --qdf --object-streams=disable test-pdflatex.pdf test-pdflatex-long.pdf
现在输出文件的可读性更强了,你可以比较 和 的输出dvipdfm
了pdftex
。我不知道这是否适用于所有情况,但在这个例子中,你可以看看字体对象:
% dvipdfm:
9 0 obj
<<
/FontFile3 11 0 R
/Ascent 694
/CapHeight 683
/Descent -194
/Flags 6
/FontBBox [-40 -250 1009 750 ]
/FontName /DJLCQW+CMR10
/ItalicAngle 0
/StemV 69
/Type /FontDescriptor
>>
endobj
和
% pfdtex
9 0 obj
<<
/FontFile 11 0 R
/Ascent 694
/CapHeight 683
/CharSet (/A/C/D/E/I/L/M/N/P/Q/S/U/V/a/b/c/comma/d/e/f/g/h/hyphen/i/j/l/m/n/o/one/p/period/q/r/s/t/u/v/w/y)
/Descent -194
/Flags 4
/FontBBox [ -40 -250 1009 750 ]
/FontName /QJZLYL+CMR10
/ItalicAngle 0
/StemV 69
/Type /FontDescriptor
/XHeight 431
>>
endobj
两者都有不同的条目引用字体文件(/FontFile3
和/FontFile
)。根据表 126“各种字体类型的嵌入式字体组织”,PDF 规范,该条目/FontFile
引用 Type1 字体程序以及/FontFile3
引用流中的子类型。因此,我们需要查看文件中的对象 #11 dvipdfm
:
11 0 obj
<<
/Subtype /Type1C
/Length 12 0 R
>>
stream
....
endstream
endobj
确实如此Type1C
,根据 PDF 规范中的同一张表:“以紧凑字体格式 (CFF) 表示的 Type 1 等效字体程序,如Adobe 技术说明 #5176,紧凑字体格式规范。”
要想知道CFF的秘密是什么,看一下《紧凑字体格式规范》的介绍就足够了:
主要的空间节省是通过使用紧凑的二进制表示来表示大部分信息、在字体之间共享公共数据以及默认经常出现的数据来实现的。