Linux 下在 PDF 页面上里添加内容

主要是用来填表的,如果是打水印一类的会简单很多,直接 pdftk [input.pdf] stamp [stamp.pdf] output [output.pdf] 就行了。但是既然是填表,所以每张肯定会不一样,所以要麻烦一点。Windows 下可以用 Foxit Reader ,这个就很方便了,不过 Foxit 的 Linux 版基本上是个残疾,所以还得靠自己动手操作最基本的工具。

如果好用的话,建议 Shell 高手写个脚本然后传播一下。

这里假设 form.pdf 是输入文件,输出文件是 output.pdf 。

首先,你需要制作包含要填的内容的 PDF 。实测 LibreOffice Draw 生成的 PDF 会覆盖掉原有 PDF 的所有内容,无论背景如何设置。LibreOffice Writer 实测可用。步骤如下:

  1. 用 gs 生成每页的图像,这些图像会在后面帮助我们定位内容。命令如下:gs -dNOPAUSE -dBATCH -r150 -sDEVICE=png48 -sOutputFile=”bg-%d.png” form.pdf 。其中的 -r150 参数指定的是 150dpi 的分辨率,这个一般应该够用了,如果不够可以自己改成 300 或者 600 。bg-%d.png 为背景图的文件名,%d 会被 gs 用页码替代。
  2. 新建一个文档,插入这些图片作为每页的背景图(这个怎么做应该不用多说了吧)。
  3. 在文档里填表,这个应该也不用多说。
  4. 填好并确认后,删掉所有的背景图片。
  5. 将文档输出成 PDF ,在这里我们假定它叫 content.pdf 。

下一步,我们需要把所有的 PDF 都拆开成单页的,这样才能把每页的内容一一对应地加进去。

  1. 把原始表单分割成单页:gs -dNOPAUSE -dBATCH -r150 -sDEVICE=pdfwrite -sOutputFile=”form-%d.pdf” form.pdf 。
  2. 把要加进去的内容也分割成单页:gs -dNOPAUSE -dBATCH -r150 -sDEVICE=pdfwrite -sOutputFile=”content-%d.pdf” content.pdf

然后,把每页分别印上去。

  • 笨一点的方法:每页手动用 pdftk form-N.pdf stamp content-N.pdf output marked-N.pdf ,其中 N 用每页的页码替代。
  • 稍微聪明点的办法:用 bash 的循环来处理,假设文档一共有 M 个页面,则 for (( i = 1; i <= M; i++)); do pdftk form-$i.pdf stamp content-$i.pdf output marked-$i.pdf; done; 。

最后,把标注好的每页 PDF 都合并到一起:

  • pdftk marked-1.pdf marked-2.pdf … marked-N.pdf cat output marked.pdf

这样,content.pdf 中的内容就被按页加入到 form.pdf 中了,生成了 marked.pdf 。大功告成!(其实写个脚本就方便多了……)

《Linux 下在 PDF 页面上里添加内容》有2个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注