如何创建相同的 PDF 文件?

如何创建相同的 PDF 文件?

如果我对同一个 .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}

相关内容