如果我对同一个 .tex 文件运行 pdflatex,则生成的 PDF 文件在位上并不相同。我该如何实现?
最小示例:
\documentclass{article}
\usepackage[pdftex]{hyperref}
\hypersetup{ pdfcreationdate={D:20131010120000}, pdfmoddate={D:20131010120000} }
\begin{document} foo \end{document}
如果我根据此示例创建两个 PDF 文件,则使用以下方法创建十六进制转储xxd然后比较这两个十六进制转储,结果如下:
--- 1 2013-10-10 15:04:17.228898334 +0200
+++ 2 2013-10-10 15:04:28.152898213 +0200
@@ -537,11 +537,11 @@
0002180: 2f53 697a 6520 3138 0a2f 5720 5b31 2032 /Size 18./W [1 2
0002190: 2031 5d0a 2f52 6f6f 7420 3135 2030 2052 1]./Root 15 0 R
00021a0: 0a2f 496e 666f 2031 3620 3020 520a 2f49 ./Info 16 0 R./I
-00021b0: 4420 5b3c 3044 3938 3745 4533 3745 3642 D [<0D987EE37E6B
-00021c0: 4344 4234 3838 3333 4237 4636 3434 3335 CDB48833B7F64435
-00021d0: 3134 3443 3e20 3c30 4439 3837 4545 3337 144C> <0D987EE37
-00021e0: 4536 4243 4442 3438 3833 3342 3746 3634 E6BCDB48833B7F64
-00021f0: 3433 3531 3434 433e 5d0a 2f4c 656e 6774 435144C>]./Lengt
+00021b0: 4420 5b3c 3439 4644 3841 3445 3241 3439 D [<49FD8A4E2A49
+00021c0: 3434 4332 3244 4442 4536 4132 3534 3139 44C22DDBE6A25419
+00021d0: 3238 4334 3e20 3c34 3946 4438 4134 4532 28C4> <49FD8A4E2
+00021e0: 4134 3934 3443 3232 4444 4245 3641 3235 A4944C22DDBE6A25
+00021f0: 3431 3932 3843 343e 5d0a 2f4c 656e 6774 41928C4>]./Lengt
0002200: 6820 3632 2020 2020 2020 2020 0a2f 4669 h 62 ./Fi
0002210: 6c74 6572 202f 466c 6174 6544 6563 6f64 lter /FlateDecod
0002220: 650a 3e3e 0a73 7472 6561 6d0a 78da 6360 e.>>.stream.x.c`
如您所见,仍然存在一些差异,但我无法找出这是什么。
有任何想法吗?
答案1
PDF 文件格式知道/ID
尾部字典中的条目(用于或多或少识别 PDF 文件)。此条目由二进制/可执行文件设置pdftex
,无法在宏级别控制。pdftex
使用当前时间和当前路径的文件名的 MD5 校验和作为 的值/ID
。
如果您想比较 PDF 文件,/ID
可以过滤掉以下行:
$ grep -av ^/ID datei1.pdf > datei1.pdf-no-id
$ grep -av ^/ID datei2.pdf > datei2.pdf-no-id
$ diff datei1.pdf-no-id datei2.pdf-no-id
顺便说一句,最小示例设置了 PDF 信息条目的创建和修改时间。还可以配置 TeX 级别的时间命令:
\year=2013
\month=10
\date=10
\time=\numexpr 12*60 + 0\relax
或者没有冗余:
\newcount\TimeHour
\newcount\TimeMin
\year=2013
\month=10
\day=10
\TimeHour=17
\TimeMin=40
\time=\numexpr\TimeHour*60+\TimeMin\relax
\makeatletter
\edef\TimeString{%
D:\the\year\two@digits\month\two@digits\day
\two@digits\TimeHour\two@digits\TimeMin 00%
}
\makeatother
\documentclass{article}
\usepackage{hyperref}
\hypersetup{
pdfcreationdate=\TimeString,
pdfmoddate=\TimeString,
}
\begin{document}
\today
\end{document}