我有一个文档,其源文件保存在git
,我想要类似的东西在每一页上打印 subversion repo 编号...我已经设法提取我需要的信息并将其显示在文档中 - 但有一个问题:要么svn
要求git
您先提交,然后重新构建 PDF,以便您可以访问最新的修订号/ID(将其插入到文档 PDF 中)。
现在,我有一个脚本,每当提交(成功)时,它都会自动将文档 PDF 上传到某个位置。如果我想在其中包含版本信息 - 我必须运行pdflatex
再次在提交之后,上传开始之前;鉴于文档是巨大的,这意味着我每次提交时都必须额外等待半分钟到一分钟,这会让我非常恼火:)
所以这就是我的想法:如果存在类似 PDF“字符串”变量的东西,它可能在TeX
ing 步骤中最终在输出 PDF 中被解压缩;那么我可以简单地使用sed -i
或其他东西来替换它的内容(这里是修订信息)以最少的时间在提交之后内联。
我的意思是:如果我查看用 生成的典型 PDF pdflatex
,less -L
我通常会得到如下内容:
%PDF-1.5
%<D0><D4><C5><D8>
3 0 obj
<<
/Length 463
/Filter /FlateDecode
>>
stream
xڭ<95>OO<E3>@^L<C5><EF><F9>^T> ...
也就是说,第一个对象定义是“纯文本”,但其内容是压缩流......(所以原则上我可以解压它们并替换那里的内容,但因为我试图使它尽可能简单,所以我对此不感兴趣)。
现在,PDF 规范实际上没有“字符串变量”:
...但是它确实有一个XObject
,您可以定义一次,然后使用重新使用每个页面Do
:它的问题是它是绝对的(但我只接受左下角的位置)。
事情是这样的;如果我可以指示 Latex 插入定义XObject
,例如:
6 0 obj
<< /Type /XObject
/Subtype /Form
/FormType 1
/BBox [ 0 0 1000 1000 ]
/Matrix [ 1 0 0 1 0 0 ]
/Resources << /ProcSet [ /PDF ] >>
/Length 58
>>
stream
%70 50 TD % without this `TD` setting, `/A Do` places this in 0,0 - bottom left corner
/F1 12 Tf
(Hello, world!) Tj
endstream
endobj
... 在 PDF 文档的开头,未压缩格式;然后如果我使用在每一页中fancyhdr
插入/A Do
;那么一旦 PDF 文档被构建,我基本上可以sed -i 's/(Hello, world!)/(rev. 117)/' out.pdf
在提交后执行并完成它。
(当然,这还不是全部 – 我们还需要插入:
/XObject <<
/A 6 0 R % XObject /A is obj 6 0
>>
...在/Page
字典中(不确定它是否可以驻留在其中/Pages
),但实际上不需要解压缩。)
那么,一般来说 - 使用LaTeX引擎( pdf
、、)可以实现这种 PDF 干预吗?lua
xe
答案1
您可以使用
\pdfinfo{/myversion (0.00.00)}
包括名称/myversion
(您应该使用其他您独有的用户名;理想情况下你会使用 Adobe/ISO 注册名称前缀0.00.00
) 与结果 PDF 信息字典中的未压缩字符串。然后,您可以轻松地0.00.00
用当前版本 (例如sed
) 替换,但替换必须具有相同的长度。