主要是用来填表的,如果是打水印一类的会简单很多,直接 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 实测可用。步骤如下:
- 用 gs 生成每页的图像,这些图像会在后面帮助我们定位内容。命令如下:gs -dNOPAUSE -dBATCH -r150 -sDEVICE=png48 -sOutputFile=”bg-%d.png” form.pdf 。其中的 -r150 参数指定的是 150dpi 的分辨率,这个一般应该够用了,如果不够可以自己改成 300 或者 600 。bg-%d.png 为背景图的文件名,%d 会被 gs 用页码替代。
- 新建一个文档,插入这些图片作为每页的背景图(这个怎么做应该不用多说了吧)。
- 在文档里填表,这个应该也不用多说。
- 填好并确认后,删掉所有的背景图片。
- 将文档输出成 PDF ,在这里我们假定它叫 content.pdf 。
下一步,我们需要把所有的 PDF 都拆开成单页的,这样才能把每页的内容一一对应地加进去。
- 把原始表单分割成单页:gs -dNOPAUSE -dBATCH -r150 -sDEVICE=pdfwrite -sOutputFile=”form-%d.pdf” form.pdf 。
- 把要加进去的内容也分割成单页: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 。大功告成!(其实写个脚本就方便多了……)
Wine一个Foxi Reader比这个步骤简单得多…… 这货MFC写的,没什么地方不兼容。
Wine 的系统整合好烦人的