为什么 pdflatex 产生的输出文件比 latex+dvipdfm 更大?

为什么 pdflatex 产生的输出文件比 latex+dvipdfm 更大?

考虑这个示例代码:

\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

现在输出文件的可读性更强了,你可以比较 和 的输出dvipdfmpdftex。我不知道这是否适用于所有情况,但在这个例子中,你可以看看字体对象:

% 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的秘密是什么,看一下《紧凑字体格式规范》的介绍就足够了:

主要的空间节省是通过使用紧凑的二进制表示来表示大部分信息、在字体之间共享公共数据以及默认经常出现的数据来实现的。

相关内容