我对 PyPDF 不太熟悉,但我知道 Ghostscript 能够为你做到这一点。以下是类似问题的其他一些答案的链接:
-
将 PDF 每页 2 面转换为每页 1 面 https://superuser.com/a/189109/40894(超级用户.com)
-
可以从中间分割 pdf 页面的免费软件吗? https://superuser.com/a/235401/40894(超级用户.com)
-
使用 Ghostscript 9.01 裁剪 PDF https://stackoverflow.com/a/6184547/359307(StackOverflow.com)
第三个答案可能就是你说的'我了解它不适用于每个 PDF 文件'。它使用pdfmark命令尝试设置/CropBox
到 PDF 页面对象中。
前两个答案的方法很可能会成功,而第三个答案会失败。此方法使用 PostScript 命令片段<</PageOffset [NNN MMM]>> setpagedevice
将 PDF 页面移动并放置在由-gNNNNxMMMM
参数(定义设备宽度和高度(以像素为单位))。
如果您理解前两个答案背后的概念,您将能够轻松地调整其中使用的方法来裁剪 PDF 页面所有 4 个边缘的边距:
一个示例命令,用于在 4 个边缘上将字母大小的 PDF (8.5x11in == 612x792pt) 裁剪半英寸 (==36pt)(命令适用于 Windows):
gswin32c.exe ^
-o cropped.pdf ^
-sDEVICE=pdfwrite ^
-g5400x7200 ^
-c "<</PageOffset [-36 -36]>> setpagedevice" ^
-f input.pdf
最终的页面大小将为 7.5x10in (== 540x720pt)。要在 Linux 或 Mac 上执行相同的操作,请使用:
gs \
-o cropped.pdf \
-sDEVICE=pdfwrite \
-g5400x7200 \
-c "<</PageOffset [-36 -36]>> setpagedevice" \
-f input.pdf
更新:如何使用 Ghostscript 确定“边距”
有评论要求“自动”确定白边距。您可以使用 Ghostscript 来实现此目的。它是bbox
设备可以确定每个页面上的(虚拟)墨水覆盖的区域(从而间接确定画布每个边缘的空白区域)。
这是命令:
gs \
-q -dBATCH -dNOPAUSE \
-sDEVICE=bbox \
input.pdf
输出(示例):
%%BoundingBox: 57 29 562 764
%%HiResBoundingBox: 57.265030 29.347046 560.245045 763.649977
%%BoundingBox: 57 28 562 667
%%HiResBoundingBox: 57.265030 28.347046 560.245045 666.295011
The bbox
设备在内存中渲染每个 PDF 页面(不将任何输出写入磁盘),然后将 BoundingBox 和 HiResBoundingBox 信息打印到stderr
。您可以像这样修改此命令以使结果更易于解析:
gs \
-q -dBATCH -dNOPAUSE \
-sDEVICE=bbox \
input.pdf \
2>&1 \
| grep -v HiResBoundingBox
输出(示例):
%%BoundingBox: 57 29 562 764
%%BoundingBox: 57 28 561 667
这会告诉你...
- ...内容矩形的左下角Page 1位于坐标处
[57 29]
右上角位于[562 741]
- ...内容矩形的左下角Page 2位于坐标处
[57 28]
右上角位于[561 667]
这意味着:
-
Page 1在左边缘使用 57pt 的空白(
72pt == 1in == 25,4mm
).
-
Page 1在底部边缘使用 29pt 的空白。
-
Page 2在左边缘使用 57pt 的空白。
-
Page 2在底部边缘使用 28pt 的空白。
正如您从这个简单的示例中看到的,每个页面的空白并不完全相同。根据您的需求(您可能希望多页 PDF 的每个页面具有相同的尺寸,不是吗?),您必须计算出文档所有页面的每个边缘的最小边距是多少。
现在右侧和顶部边缘的空白又如何呢?要计算该值,您需要知道每个页面的原始页面大小。确定这一点的最简单方法:pdfinfo
公用事业。 5 页 PDF 的命令示例:
pdfinfo \
-f 1 \
-l 5 \
input.pdf \
| grep "Page "
输出(示例):
Page 1 size: 612 x 792 pts (letter)
Page 2 size: 612 x 792 pts (letter)
Page 3 size: 595 x 842 pts (A4)
Page 4 size: 842 x 1191 pts (A3)
Page 5 size: 612 x 792 pts (letter)
这将帮助您确定所需的画布尺寸以及每个新 PDF 页面的顶部和右侧边缘所需的(最大)白边距。
当然,这些计算也都可以编写脚本。
但是,如果您的 PDF 都是统一的页面大小,或者它们是单页文档,那么这一切就更容易完成......