分割PDF文档

将大尺寸PDF文件切割为数个小尺寸页面以方便打印,适合处理地图与工程图纸

--by Captdam @ Oct 16, 2025 Nov 2, 2024

[en] Here is the English version of this article

【中】 这里是这篇文章的中文版

目录

示例

你可以在下面窗口(嵌入GitHub page)打开一个本地PDF文件,调整横向与纵向切割数量并生成切割后的PDF文件。所有的计算都在你的浏览器本地完成。除了打开了这个网页、加载了GitHub page并下载了PDF-Lib外,没有人知道你干了什么,包括打开了什么PDF文件。

原理

我们可以将PDF文件的每一页想象成一张画布,文字、图片等元素将会被按照特定坐标渲染在画布上。

PDF文件内有很多定义页面的边框,其中就包括了Media Box。当打开一个PDF文件并渲染其中的页面时,Midia Box以外的内容将会被舍弃掉。

通常情况下,Media Box的尺寸和画布尺寸相同。这很好理解,我们没有必要准备一张很大的画布但是只是用其中一小部分。

但是现在,我们只想要这张很大的画布上的一小部分,我们就可以使用一个比画布小的Media Box,舍弃Media Box以外的部分,只保留Midia Box以内的一小片区域。这个方法的优雅的地方在于,我们不需要去担心画布上各种元素(文字、图片)。

假设我们想要将文件的长宽各自对半切割,我们就可以将文件中每一页复制四份,对第一份副本的左上角设定Media Box取样,对第二份副本的右上角设定Media Box取样,对第三份副本的左下角设定Media Box取样,对第四份副本的右上下角设定Media Box取样。

开发过程

为了方便在小尺寸的纸张上打印大尺寸图纸,于是我写了这个Web应用。

有一些图纸是在大尺寸的纸张上建立的,图纸尺寸越大,一页包含的信息也就越多。比如说,ANSI E纸张的尺寸就是34英寸的44英寸(近似于1米的0.75米)。如果能使用大尺寸的纸张,那么大尺寸图纸无疑能方便阅读。但是,一般的家用打印机只能支持信笺纸(11英寸的8.5英寸)或相似的小尺寸纸张(比如A4)。一些办公用打印机可以使用大一点的纸张,例如Ledger(11英寸的17英寸)。对于更大的纸张,要么需要专业的打印机,将花费一笔不晓得投资;或是需要前往打印店,很是麻烦。

下面以温莎市的地图为例。如果要把它打印出来,我们只能使用一页的尺寸。就如截屏所示,字体非常小,很难阅读。

打印大地图时的截图
打印大地图时的截图 - City of Windsor的地图

在这个打印的窗口内,我们可以选择大尺寸的纸张,但是在打印机内放入小尺寸的纸张。这样,打印机就会自动切割文件为多页实际使用的纸张的大小。这个方法非常的不优雅,我们没办法预览实际打印的效果,需要一些试错才能得到想要的效果。

另一个办法是使用软件来预处理,即,使用软件来将大的文件切割为数个小尺寸的文件。之后,就可以像是正常文件一样打印了。一个例子就是使用imagemagick的convert指令来切割图像,比如这个命令:convert -extract 4800x3600+4800+7200 src.png tile2x3.png。但是,这个办法需要Linux系统或WSL,并且需要安装软件。

另外,我们也可以使用一些在线工具。这很方便,不需要安装软件,电脑和手机(或是任何支持网页浏览的设备)都可以操作,只要有浏览器并且能联网就行。但是,这个本法无法保证文件的安全性,比如需要保密的工程图。

于是,我决定自己写一个软件。我使用了之前做工程图PDF标题栏与目录生成器使用的PDF-Lib库来在浏览器中本地切割PDF文档。

打印切割后的大地图时的截图
打印切割后的大地图时的截图