查看: 299|回复: 0

Python拆分PDF:Spire.PDF逐页提取与长页分页

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
PDF 拆分是文档自动化中的常见步骤。季度报告、扫描合同、批量发票等文件常有几十到上百页,而接收方往往只需要其中几页。手动用 PDF 编辑器逐个拆分效率低,也很难批量处理,用 Python 脚本更合适。下面以 Spire.PDF for Python 为例,说明三种常见拆分方式:整档逐页拆分为单页文档、提取指定页面生成新 PDF、把超长页面按标准页高切成多页。

环境准备

安装 Spire.PDF:
  1. pip install Spire.PDF
复制代码

脚本中引入模块:
  1. from spire.pdf import *
  2. from spire.pdf.common import *
复制代码

方式一:用 Split() 将 PDF 拆分为单页文档

如果目标是把每一页都变成独立 PDF,最直接的方式是调用 PdfDocument.Split()。它接收一个带 {0} 占位符的文件名模板,占位符会被替换成页码索引,且索引从 0 开始。例如 10 页文档会生成 SplitDocument-0.pdf 到 SplitDocument-9.pdf。加载文档、执行拆分后,调用 Close() 释放资源。
  1. from spire.pdf import *
  2. from spire.pdf.common import *
  3. # 加载 PDF 文档
  4. doc = PdfDocument()
  5. doc.LoadFromFile("Sample.pdf")
  6. # 按文件名模板拆分,每一页生成一个独立 PDF
  7. doc.Split("SplitDocument-{0}.pdf")
  8. doc.Close()
复制代码

这种方式不需要逐页写循环,适合批量拆分整个目录下的文档。文件名模板里还可以加入路径前缀,例如 “output/SplitDocument-{0}.pdf”,让拆分结果直接输出到指定目录。

方式二:提取指定页面生成新 PDF

更多时候只需要源文档中的某几页。实现思路是新建一个 PdfDocument,然后遍历要提取的源页码:为每个源页面添加同尺寸的新页面,再把源页面内容绘制进去。页面尺寸通过 Pages.Add() 的第一个参数传入,通常直接使用源页面的 Size;PdfMargins(0.0) 把新页面边距设为 0,避免内容错位。CreateTemplate() 为源页面生成绘制模板,Draw() 把它原样画到新页面上,内容和排版不会丢失。
  1. from spire.pdf import *
  2. from spire.pdf.common import *
  3. # 加载源文档
  4. oldPdf = PdfDocument()
  5. oldPdf.LoadFromFile("Sample.pdf")
  6. # 新建目标文档
  7. newPdf = PdfDocument()
  8. page = None
  9. # 提取索引 1、2 两页(页码从 0 开始)
  10. for i in range(1, 3):
  11.     # 添加与源页面同尺寸的页面
  12.     page = newPdf.Pages.Add(oldPdf.Pages[i].Size, PdfMargins(0.0))
  13.     # 把源页面内容绘制到新页面
  14.     oldPdf.Pages[i].CreateTemplate().Draw(page, PointF(0.0, 0.0))
  15. newPdf.SaveToFile("ExtractPages.pdf")
  16. newPdf.Close()
  17. oldPdf.Close()
复制代码

range(1, 3) 表示提取第 2、3 页;修改这个范围就能提取任意页码组合。实际使用时建议先用文档对象的 Pages.Count 查看总页数,再决定循环范围,避免索引越界。

方式三:将一个长页面拆分为多页

还有一类需求是源 PDF 中有一张很长的页面,例如长截图或连续表格,希望按标准页高切成多页。做法是新建文档,宽度保持不变,高度只取源页面高度的一部分,再利用自动分页布局绘制源页内容。
  1. from spire.pdf import *
  2. from spire.pdf.common import *
  3. # 加载源文档并获取第一页
  4. doc = PdfDocument()
  5. doc.LoadFromFile("LongPage.pdf")
  6. page = doc.Pages[0]
  7. # 新建文档:边距为 0,宽度不变,高度取源页的一半
  8. newPdf = PdfDocument()
  9. newPdf.PageSettings.Margins.All = 0.0
  10. newPdf.PageSettings.Width = page.Size.Width
  11. newPdf.PageSettings.Height = page.Size.Height / float(2)
  12. # 添加新页面并设置自动分页布局
  13. newPage = newPdf.Pages.Add()
  14. format = PdfTextLayout()
  15. format.Break = PdfLayoutBreakType.FitPage
  16. format.Layout = PdfLayoutType.Paginate
  17. # 绘制源页内容,内容超出页高时自动换页
  18. page.CreateTemplate().Draw(newPage, PointF(0.0, 0.0), format)
  19. newPdf.SaveToFile("SplitOnePage.pdf")
  20. newPdf.Close()
  21. 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 自动分页把一个长页面切成多页。把这些逻辑与文件遍历、页码计算组合后,可以接入批量拆分、按人分发文档等自动化流程。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-10-1 12:16 , Processed in 0.021556 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部