包含生成的 pdf 的文件大小

包含生成的 pdf 的文件大小

我怎样才能将生成的 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 文件大小似乎会循环显示相同的数字。

相关内容