我正在编写一个 Ruby 脚本/应用程序来帮助我将 LaTeX 编译为(至少)PDF。我希望它具有的一个功能是它应该迭代地运行 pdflatex
直到 PDF 收敛(我猜它应该如此)。
想法是使用指纹将一次迭代中生成的 PDF 与前一次迭代中生成的 PDF 进行比较。特别是,我目前使用 Digest::MD5.file(.)
。
现在的问题是这永远不会收敛。一个(希望是)罪魁祸首是 PDF 的时间戳,它至少被 pdflatex
设置为秒。由于 pdflatex
的运行时间通常超过一秒,因此结果不断变化。也就是说,我希望 PDF 在某个时间点后等于时间戳。这个假设可能是错误的;提示表示赞赏。
我该怎么办?到目前为止我的基本想法:
- 使用能够胜任这项工作的图书馆
- 去除元数据,只散列 PDF 内容
- 比较前用固定值覆盖时间戳
您有更多想法甚至解决方案吗?解决方案应该只使用在 Linux 上运行的免费软件。这样,只使用 Ruby 是首选,但使用外部软件是完全可以接受的。
顺便说一句,我不完全知道 PDF 是如何编码的,但我怀疑仅仅比较包含的文本对我来说不起作用,因为在以后的迭代中只有图形或链接可能会发生变化。
可能相关:
- How to compare two PDF files?(凌乱的、基于文本的或专有的解决方案)
- Functional PDF Testing(使用 Java 库;不清楚它是否适合工作)
最佳答案
这可能不是最可靠的解决方案,但它对我有用:
grep -av -e '^/CreationDate' -e '^/ModDate' -e '^/ID' file.pdf | md5sum
或者来自 Ruby
`grep -av -e '^/CreationDate' -e '^/ModDate' -e '^/ID' file.pdf | md5sum`.chop!
这会在删除导致假定相同的 PDF 不同的行后计算 PDF 的哈希值。
YMMV,取决于您的 PDF 创建者。要找出您需要删除的其他行,请使用
diff -a file-1.pdf file-2.pdf | less
关于ruby - 将 PDF 内容与 Ruby 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4797307/