考虑以下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 格式的注释字符。
所以有两个问题。
- 我的分析对吗?
- 为什么会
pdftex
输出这样的评论(我的意思是为什么会输出% 2 0 obj
)?
答案1
您看到的并不是完全未压缩的 PDF。要获得这样的 PDF,您必须说
\pdfcompresslevel=0
\pdfobjcompresslevel=0
根据 PDF 规范,有两种不同的压缩级别。
第一个由驱动程序\pdfcompresslevel
中的的值控制pdftex
,处理页面对象、XObject、嵌入文件和其他的内容流,即stream
和endstream
关键字之间包含的数据。
其次,PDF 文件的 PDF 对象本身可以打包到 类型的容器对象的内容流中/ObjStm
。这由 控制\pdfobjcompresslevel
。
由于在示例代码中,\pdfcompresslevel
设置为零,因此/ObjStm
第二个代码框中列出的对象编号 4 的内容流未压缩。可以看到打包到其中的对象。关键字后面的第一行stream
列出了所有打包对象的流中的编号和字节偏移量。注释的对象编号仅供参考。