我怎样才能将生成的 PDF 的(近似)文件大小包含在文档中pdflatex
?我设想必须编译三次:第一次创建 PDF,第二次将大小写入文件.aux
,第三次将其包含在文档中。一个最小的工作示例将是具有教育意义和实用性的!
答案1
\documentclass{article}
\IfFileExists{\jobname.pdf}
{\edef\Size{\pdffilesize{\jobname.pdf}}}
{\def\Size{0}}
\begin{document}
\Size
xyz
\end{document}
测试上次运行生成的 PDF 文件是否存在前 pdftex
开始在新文件上写入。该原语\pdffilesize
输出文件大小,并\edef
在执行时冻结它\pdffilesize
。
由于压缩,它不会精确到字节。我明白了
10401
9427
10258
10599
10466
在文档中连续运行。除以 1024 并四舍五入可能会更好:
\IfFileExists{\jobname.pdf}
{\edef\Size{\number\numexpr\pdffilesize{\jobname.pdf}/1024\relax\,KiB}}
{\def\Size{0\,KiB}}
答案2
这是 ConTeXt MkIV 中的实现。我使用io.fileseize(...)
(ConTeXt 库的一部分l-io.lua
)查找 pdf 文件的大小并将其添加到两遍数据列表中。默认情况下,如果两遍数据列表发生变化,ConTeXt 会自动重新编译文件,直到最多运行 8 次后,即使两遍数据发生变化,它也会停止。
文件大小始终不稳定!以下是具体实现。
\def\OutputSize{0}
\def\PrevOutputSize{0}
\definetwopasslist{OutputSize}
% Read size from aux file
\gettwopassdata{OutputSize}
\iftwopassdatafound
\xdef\PrevOutputSize{\twopassdata}
\fi
% Find the new size
\doiffile{\jobname.pdf}
{\ctxlua{context.setvalue("OutputSize", io.size("\jobname.pdf"))}}
\savetwopassdata {OutputSize} {\PrevOutputSize} {\OutputSize}
% Useful for grepping the result
\writestatus{CHECK}{Outsize: \PrevOutputSize, Newsize: \OutputSize}
% Show figure size on footer
\setupfootertexts[\jobname: \OutputSize]
\starttext
\input knuth
\stoptext
从临时目录开始,编译文件并CHECK
在输出中查找:
$ context test.tex | grep CHECK
CHECK > Outsize: 0, Newsize: 0
CHECK > Outsize: 0, Newsize: 9380
CHECK > Outsize: 9380, Newsize: 10033
CHECK > Outsize: 10033, Newsize: 9751
CHECK > Outsize: 9751, Newsize: 9858
CHECK > Outsize: 9858, Newsize: 9921
CHECK > Outsize: 9921, Newsize: 9706
CHECK > Outsize: 9706, Newsize: 9952
可以看出,即使运行了 8 次,文件大小仍未稳定下来。我再次运行它(不删除任何临时文件),得到
$ context test.tex | grep CHECK
CHECK > Outsize: 9952, Newsize: 9892
CHECK > Outsize: 9892, Newsize: 9856
CHECK > Outsize: 9856, Newsize: 10083
CHECK > Outsize: 10083, Newsize: 9899
CHECK > Outsize: 9899, Newsize: 9732
CHECK > Outsize: 9732, Newsize: 9965
CHECK > Outsize: 9965, Newsize: 9927
CHECK > Outsize: 9927, Newsize: 9793
因此,即使运行了 16 次,文件大小仍未稳定下来。我认为文件大小的波动是因为 pdf 输出被压缩了。
我补充道
\pdfcompresslevel=0
在文件顶部,然后再次从头开始。这一次我得到了
$ context test.tex | grep CHECK
CHECK > Outsize: 0, Newsize: 0
CHECK > Outsize: 0, Newsize: 15044
CHECK > Outsize: 15044, Newsize: 15638
CHECK > Outsize: 15638, Newsize: 15920
CHECK > Outsize: 15920, Newsize: 15827
CHECK > Outsize: 15827, Newsize: 15798
CHECK > Outsize: 15798, Newsize: 15810
CHECK > Outsize: 15810, Newsize: 15692
$ context test.tex | grep CHECK
CHECK > Outsize: 15692, Newsize: 15865
CHECK > Outsize: 15865, Newsize: 15730
CHECK > Outsize: 15730, Newsize: 15827
CHECK > Outsize: 15827, Newsize: 15798
CHECK > Outsize: 15798, Newsize: 15810
CHECK > Outsize: 15810, Newsize: 15692
CHECK > Outsize: 15692, Newsize: 15865
CHECK > Outsize: 15865, Newsize: 15730
再次,文件大小振荡,我不知道为什么会发生这种情况。
因此,最后我决定将文件大小以千字节为单位进行四舍五入,方法是将文件大小除以1024
。
% Find the new size
\doiffile{\jobname.pdf}
{\ctxlua{context.setvalue("OutputSize", string.format("\%d", io.size("\jobname.pdf")/1024))}}
这次,正如预期的那样,编译在运行三次后停止。
$ context test.tex | grep CHECK
CHECK > Outsize: 0, Newsize: 0
CHECK > Outsize: 0, Newsize: 9
CHECK > Outsize: 9, Newsize: 9
答案3
由于 pdf 的压缩方式(数字),文件大小并不稳定。只要您输入新的文件大小(数字不同),转换为 pdf 时压缩方式就会不同。
例如,以下代码:
\documentclass{article}
\begin{document}
1234
\end{document}
以及以下代码:
\documentclass{article}
\begin{document}
4321
\end{document}
将生成大小相同的文件,但是此代码:
\documentclass{article}
\begin{document}
1235
\end{document}
会产生不同大小的 pdf 文件。因此,当您将此新大小插入文档时,仅仅因为数字与上次不同,它就会产生不同大小的 pdf 文件。但是,您可能会发现,经过多次迭代后,pdf 文件大小似乎会循环显示相同的数字。