给 pdf 文档加页码,the Poor Man's Way

经验

最近又有了突发的处理文档的需求,这次是给一个文档的每一页加上页码。 一般的做法是:

  • 直接用 pdf 编辑软件提供的功能。 我没有安装任何 pdf 编辑软件,况且编辑功能一般是高级功能, 需要 Pro 版本或者开通会员。我并不是经常有这种需求,感觉没必要。
  • 上传到某些在线处理的网站。 虽然同样简单易操作,但我也并不希望把文件上传到别人的服务器。

于是在这里给出两个可行的用开源软件解决这个需求的方案。

pdftk

注意这里指的不是谷歌搜索排第一的那个,而是一个只有命令行的用 Java 写的开源软件。 其实我也不太清楚这两个之间是个什么关系, 我自己是用 pacman 装的

我之前用它处理过文档拆分合并等简单功能, 这次简单搜索了一下发现加页码也能做到, 相比在图形界面点点点有一定门槛但不高,需要一点 $\LaTeX$ 知识。

思路就是先制造一个只有页码的文档,然后用 pdftk 的 multistamp 功能把两个文档的内容叠加到一起。

例如创建一个 pages.tex 文件,其内容可以自由发挥

 \documentclass[a4paper]{article}
 \usepackage{multido}
 % 控制页码的边距
 \usepackage[hmargin=.8cm,vmargin=1.5cm,nohead,nofoot]{geometry}
 % 控制页码的大小和样式
 \renewcommand*{\thepage}{\large{\arabic{page}}}
 % 控制页码的位置
 % https://www.overleaf.com/learn/latex/Headers_and_footers#LaTeX_page_styles
 \pagestyle{headings}
 \begin{document}
 % 控制页数
 \multido{}{100}{\vphantom{x}\newpage}
 \end{document}

编译后可以得到只包含页码的 pages.pdf,注意这个文档的页数要大于等于需要加页码的输入文档的页数。

之后,运行 pdftk input.pdf multistamp pages.pdf output output.pdf 得到的输出是两个文档每一页的叠加。

Stirling PDF

搜索的过程中发现了另一个解决方案,就是自建一个 pdf 文档处理网站。这里也有开源软件可以用,就是 Stirling PDF

经过 xz 事件,开源软件也不是能够无脑相信的了。我并不能确定这个软件有没有偷偷上传文档的行为, 只是看到它 star 的数量比较多就用了,但愿没有人在这个项目里作恶吧。

我的 docker compose 配置用官方提供的小改了一下:

version: '3.3'
services:
  stirling-pdf:
    image: frooodle/s-pdf:latest
    ports:
      - '127.0.0.1:10080:8080'
    volumes:
      - ./tessdata:/usr/share/tessdata #Required for extra OCR languages
      - ./configs:/configs
#      - /location/of/customFiles:/customFiles/
#      - /location/of/logs:/logs/
    environment:
      - DOCKER_ENABLE_SECURITY=false
      - INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false
      - LANGS=zh_CN

这里我习惯绑定到本地端口,之后再在 Nginx 里面配一下反向代理就可以了。

这个软件功能实在是太多了,我只验证了一下加页码功能,感觉还挺好用的, 但是自定义程度不如上面自己写 $\LaTeX$ 高。

至于更复杂的功能好不好用要等之后有需求了。

总结

if "有钱" then
    "用 Adobe Acrobat Pro"
elseif "不在乎隐私" then
    "用其他人的网站"
elseif "有服务器" and "样式要求不高" then
    "自建 Stirling PDF"
else
    "用 pdftk"
end