如何创建相同的 PDF 文件pdflatex这个问题基本已经回答了:
问题是/ID
在创建 PDF 文件后过滤掉预告片词典中的条目。
我现在被迫使用赛莱特并且这个技巧不再起作用,因为生成的 PDF 文件中还有更多的更改。
以下是最小工作示例:
\documentclass[11pt,a4paper]{article}
\usepackage[]{hyperref}
\hypersetup{
pdfauthor={None},
pdfcreationdate={D:20131010120000},
pdfmoddate={D:20131010120000}
}
\begin{document}
foo
\end{document}
如果我现在创建 2 个 PDF 文件,将它们转换为十六进制转储并查看差异...
xelatex mwe.tex; mv mwe.pdf a.pdf; xxd a.pdf > a.bin
xelatex mwe.tex; mv mwe.pdf b.pdf; xxd b.pdf > b.bin
diff -u a.bin b.bin
... 那么不幸的是,您会发现生成的 PDF 文件存在很多差异。
有没有办法生成按位相同的 PDF 文件赛莱特?
我需要这个的原因是我想为软件发布包创建 PDF 文件。当然,当底层软件和文档没有改变时,软件发布包应该是相同的。
答案1
您可以使用最新发布的 Texlive
SOURCE_DATE_EPOCH=0 FORCE_SOURCE_DATE=1 xelatex pp407
您可能还想设置
SOURCE_DATE_EPOCH_TEX_PRIMITIVES=1
第一个设置是纪元设置。即自 1970 年以来的秒数。
例如,对于今天(而不是 0 即 1970 年 1 月 1 日),您可以使用1505482364
以下方法找到:
$ date +%s
1505482364
第二个如果设置为 1(或任何值)则会导致 tex 命令\year
使用指定的纪元日期而不是系统时钟。
其中两者的组合使用提供的测试文件在 texlive2017 中产生了可重现的结果(第二次运行后)。
第一次运行:
SOURCE_DATE_EPOCH=0 FORCE_SOURCE_DATE=1 xelatex pp407
生成:
Package hyperref Warning: Rerun to get /PageLabels entry.
第二次运行
SOURCE_DATE_EPOCH=0 FORCE_SOURCE_DATE=1 xelatex pp407
生成:
...
Output written on pp407.pdf (1 page).
Transcript written on pp407.log.
保存 pdf
cp pp407.pdf pp407-a.pdf
再次运行
Output written on pp407.pdf (1 page).
Transcript written on pp407.log.
比较
cmp pp407.pdf pp407-a.pdf
没有输出cmp
确认文件是否相同。