最近又有了突发的处理文档的需求,这次是给一个文档的每一页加上页码。 一般的做法是:
- 直接用 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