关于 pdftex 输出原始 pdf 文件的一个基本问题

关于 pdftex 输出原始 pdf 文件的一个基本问题

考虑以下tex要用 进行编译的简单文件pdflatex

\pdfcompresslevel=0
\documentclass{standalone}
\begin{document}
\hrulefill
\end{document}

得益于\pdfcompresslevel=0,生成的pdf文件是可读的。可以找到以下几行:

4 0 obj <<
/Type /ObjStm
/N 4
/First 22
/Length 257       
>>
stream
2 0 1 105 5 139 6 191
% 2 0 obj
<<
/Type /Page
/Contents 3 0 R
/Resources 1 0 R
/MediaBox [0 0 343.711 0.398]
/Parent 5 0 R
>>
% 1 0 obj
<<
/ProcSet [ /PDF ]
>>
% 5 0 obj
<<
/Type /Pages
/Count 1
/Kids [2 0 R]
>>
% 6 0 obj
<<
/Type /Catalog
/Pages 5 0 R
>>
endstream
endobj

据我了解,类似这样的调用5 0 R指的是 定义的对象5 0 obj。这样的对象似乎确实被定义了,但以 开头%,应该是 pdf 格式的注释字符。

所以有两个问题。

  1. 我的分析对吗?
  2. 为什么会pdftex输出这样的评论(我的意思是为什么会输出% 2 0 obj)?

答案1

您看到的并不是完全未压缩的 PDF。要获得这样的 PDF,您必须说

\pdfcompresslevel=0
\pdfobjcompresslevel=0

根据 PDF 规范,有两种不同的压缩级别。

第一个由驱动程序\pdfcompresslevel中的的值控制pdftex,处理页面对象、XObject、嵌入文件和其他的内容流,即streamendstream关键字之间包含的数据。

其次,PDF 文件的 PDF 对象本身可以打包到 类型的容器对象的内容流中/ObjStm。这由 控制\pdfobjcompresslevel

由于在示例代码中,\pdfcompresslevel设置为零,因此/ObjStm第二个代码框中列出的对象编号 4 的内容流未压缩。可以看到打包到其中的对象。关键字后面的第一行stream列出了所有打包对象的流中的编号和字节偏移量。注释的对象编号仅供参考。

相关内容