PDF 拆分是文档自动化中的常见步骤。季度报告、扫描合同、批量发票等文件常有几十到上百页,而接收方往往只需要其中几页。手动用 PDF 编辑器逐个拆分效率低,也很难批量处理,用 Python 脚本更合适。下面以 Spire.PDF for Python 为例,说明三种常见拆分方式:整档逐页拆分为单页文档、提取指定页面生成新 PDF、把超长页面按标准页高切成多页。
环境准备
安装 Spire.PDF:
脚本中引入模块:
- from spire.pdf import *
- from spire.pdf.common import *
复制代码
方式一:用 Split() 将 PDF 拆分为单页文档
如果目标是把每一页都变成独立 PDF,最直接的方式是调用 PdfDocument.Split()。它接收一个带 {0} 占位符的文件名模板,占位符会被替换成页码索引,且索引从 0 开始。例如 10 页文档会生成 SplitDocument-0.pdf 到 SplitDocument-9.pdf。加载文档、执行拆分后,调用 Close() 释放资源。
- from spire.pdf import *
- from spire.pdf.common import *
- # 加载 PDF 文档
- doc = PdfDocument()
- doc.LoadFromFile("Sample.pdf")
- # 按文件名模板拆分,每一页生成一个独立 PDF
- doc.Split("SplitDocument-{0}.pdf")
- doc.Close()
复制代码
这种方式不需要逐页写循环,适合批量拆分整个目录下的文档。文件名模板里还可以加入路径前缀,例如 “output/SplitDocument-{0}.pdf”,让拆分结果直接输出到指定目录。
方式二:提取指定页面生成新 PDF
更多时候只需要源文档中的某几页。实现思路是新建一个 PdfDocument,然后遍历要提取的源页码:为每个源页面添加同尺寸的新页面,再把源页面内容绘制进去。页面尺寸通过 Pages.Add() 的第一个参数传入,通常直接使用源页面的 Size;PdfMargins(0.0) 把新页面边距设为 0,避免内容错位。CreateTemplate() 为源页面生成绘制模板,Draw() 把它原样画到新页面上,内容和排版不会丢失。
- from spire.pdf import *
- from spire.pdf.common import *
- # 加载源文档
- oldPdf = PdfDocument()
- oldPdf.LoadFromFile("Sample.pdf")
- # 新建目标文档
- newPdf = PdfDocument()
- page = None
- # 提取索引 1、2 两页(页码从 0 开始)
- for i in range(1, 3):
- # 添加与源页面同尺寸的页面
- page = newPdf.Pages.Add(oldPdf.Pages[i].Size, PdfMargins(0.0))
- # 把源页面内容绘制到新页面
- oldPdf.Pages[i].CreateTemplate().Draw(page, PointF(0.0, 0.0))
- newPdf.SaveToFile("ExtractPages.pdf")
- newPdf.Close()
- oldPdf.Close()
复制代码
range(1, 3) 表示提取第 2、3 页;修改这个范围就能提取任意页码组合。实际使用时建议先用文档对象的 Pages.Count 查看总页数,再决定循环范围,避免索引越界。
方式三:将一个长页面拆分为多页
还有一类需求是源 PDF 中有一张很长的页面,例如长截图或连续表格,希望按标准页高切成多页。做法是新建文档,宽度保持不变,高度只取源页面高度的一部分,再利用自动分页布局绘制源页内容。
- from spire.pdf import *
- from spire.pdf.common import *
- # 加载源文档并获取第一页
- doc = PdfDocument()
- doc.LoadFromFile("LongPage.pdf")
- page = doc.Pages[0]
- # 新建文档:边距为 0,宽度不变,高度取源页的一半
- newPdf = PdfDocument()
- newPdf.PageSettings.Margins.All = 0.0
- newPdf.PageSettings.Width = page.Size.Width
- newPdf.PageSettings.Height = page.Size.Height / float(2)
- # 添加新页面并设置自动分页布局
- newPage = newPdf.Pages.Add()
- format = PdfTextLayout()
- format.Break = PdfLayoutBreakType.FitPage
- format.Layout = PdfLayoutType.Paginate
- # 绘制源页内容,内容超出页高时自动换页
- page.CreateTemplate().Draw(newPage, PointF(0.0, 0.0), format)
- newPdf.SaveToFile("SplitOnePage.pdf")
- newPdf.Close()
- doc.Close()
复制代码
这里的关键是 PdfTextLayout 的两个属性:Layout = PdfLayoutType.Paginate 表示绘制内容超出页面时自动分页;Break = PdfLayoutBreakType.FitPage 表示按页面高度截断。由于新页面高度是源页的一半,一页长内容会被平铺到两个标准页上。Height 除以的数字越小,切出的页数越多,可按实际内容高度调整。
实用提示
1. 输出位置:Split() 的文件名模板支持路径前缀,可把拆分结果直接写入指定目录。
2. 页码从 0 开始:提取页面时先用文档对象的 Pages.Count 确认总页数,再决定循环范围,避免索引越界。
3. 拆分粒度:长页切分时,Height 除数决定页数;除数越小,页数越多。
4. 资源释放:源文档和目标文档用完都应调用 Close(),批量处理时尤其重要。
5. 免费版限制:Spire.PDF 免费版对处理页数有限制,大批量或大文档场景需要留意这一约束。
总结
围绕 Spire.PDF for Python,可以用三种方式完成 PDF 拆分:PdfDocument.Split() 把整个文档逐页拆成单页文件;CreateTemplate().Draw() 把指定页码提取成新文档;借助 PdfLayoutType.Paginate 自动分页把一个长页面切成多页。把这些逻辑与文件遍历、页码计算组合后,可以接入批量拆分、按人分发文档等自动化流程。 |