查看: 111|回复: 0

Python拆分PDF文件:按页拆分、指定范围抽取与超长页重排实现

[复制链接]
发表于 半小时前 | 显示全部楼层 |阅读模式
在处理多页PDF文档时,经常需要按页拆分、抽取指定页码范围,或者将超长页面重新分页。手动操作在线工具不仅效率低,还可能存在文件外泄风险。借助Python的Spire.PDF库,可以在本地用几行代码完成这些拆分需求。下面介绍三种常见拆分思路的具体实现,并补充批量处理和文件命名的实用技巧。

环境准备

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

安装完成后,在脚本中引入相关命名空间,后续示例均以PdfDocument作为核心操作对象:
  1. from spire.pdf.common import *
  2. from spire.pdf import *
复制代码

将PDF拆分为单页文件

如果要把一个多页PDF的每一页分别保存为独立文件,可以直接调用PdfDocument的Split方法。该方法会遍历每一页,并按指定文件名模板生成单页PDF。
  1. from spire.pdf.common import *
  2. from spire.pdf import *
  3. input_file = "Sample.pdf"
  4. doc = PdfDocument()
  5. doc.LoadFromFile(input_file)
  6. # {0}会被替换为页码索引,生成类似SplitDocument-0.pdf、SplitDocument-1.pdf的文件
  7. pattern = "SplitDocument-{0}.pdf"
  8. doc.Split(pattern)
  9. doc.Close()
复制代码

这里Split方法的参数是一个带占位符{0}的文件名模板,运行时自动使用从0开始的页码序号替换占位符。这种方式适合整本拆散的场景,代码量最少。

按指定页面范围拆分文件

如果只需要提取文档中的某几页,可以创建一个新PdfDocument,按源页面尺寸添加新页,再通过CreateTemplate().Draw()把源页内容绘制到新页面。
  1. from spire.pdf.common import *
  2. from spire.pdf import *
  3. input_file = "/Sample.pdf"
  4. output_file = "/按范围拆分.pdf"
  5. old_pdf = PdfDocument()
  6. old_pdf.LoadFromFile(input_file)
  7. new_pdf = PdfDocument()
  8. # 抽取索引为1和2的页面,即原文档的第2、3页
  9. for i in range(1, 3):
  10.     page = new_pdf.Pages.Add(old_pdf.Pages[i].Size, PdfMargins(0.0))
  11.     old_pdf.Pages[i].CreateTemplate().Draw(page, PointF(0.0, 0.0))
  12. new_pdf.SaveToFile(output_file)
  13. new_pdf.Close()
  14. old_pdf.Close()
复制代码

关键参数说明:PdfMargins(0.0)确保新页面没有额外页边距,PointF(0.0, 0.0)让源页模板左上角对齐新页原点,避免内容被缩放或产生白边。调整range的起止值即可抽取任意连续页码范围。

将单个大页面拆分为多页

当某一页高度过大,比如长截图或折叠扫描件,直接阅读和打印都不方便。可以通过PdfTextLayout的Break和Layout属性,让源页模板按新页面高度自动分页。
  1. from spire.pdf.common import *
  2. from spire.pdf import *
  3. input_file = "/Sample.pdf"
  4. output_file = "/分割单页.pdf"
  5. doc = PdfDocument()
  6. doc.LoadFromFile(input_file)
  7. # 取出需要重新分页的页面,这里以第一页为例
  8. page = doc.Pages[0]
  9. new_pdf = PdfDocument()
  10. new_pdf.PageSettings.Margins.All = 0.0
  11. new_pdf.PageSettings.Width = page.Size.Width
  12. new_pdf.PageSettings.Height = page.Size.Height / float(2)
  13. new_page = new_pdf.Pages.Add()
  14. # 设置排版规则,超过一页高度时自动分到下一页
  15. layout = PdfTextLayout()
  16. layout.Break = PdfLayoutBreakType.FitPage
  17. layout.Layout = PdfLayoutType.Paginate
  18. page.CreateTemplate().Draw(new_page, PointF(0.0, 0.0), layout)
  19. new_pdf.SaveToFile(output_file)
  20. new_pdf.Close()
  21. doc.Close()
复制代码

new_pdf.PageSettings.Height设置为原页高度的一半,相当于把一页切成两页。实际使用时可根据需要调整除数。这种切页本质是重新排版,对文本型内容效果较好;如果源页是位图图像,库会尽量按比例裁切,但最终效果取决于原始内容构成。

批量拆分多个PDF文件

结合os模块可以遍历文件夹,对每个PDF文件自动执行拆分。
  1. import os
  2. from spire.pdf.common import *
  3. from spire.pdf import *
  4. folder = "./pdfs"
  5. for name in os.listdir(folder):
  6.     if not name.lower().endswith(".pdf"):
  7.         continue
  8.     doc = PdfDocument()
  9.     doc.LoadFromFile(os.path.join(folder, name))
  10.     # 用原文件名作为前缀,避免不同文件拆分出的页面重名
  11.     doc.Split(os.path.join(folder, "split", f"{os.path.splitext(name)[0]}-{{0}}.pdf"))
  12.     doc.Close()
复制代码

拆分后保留页面顺序与命名

Split方法生成文件名时使用的{0}是零基索引,第一页对应0。如果需要从1开始编号,可以在拆分后通过os.rename进行重命名。另外,无论是按范围抽取还是切页,源文档中的链接、注释等元素都会随页面内容一起被绘制到新文档中,拆分后通常无需额外处理。

以上三种方法覆盖了PDF拆分的典型粒度:整本拆散、按需抽取、重新排版分页。实际项目中可以组合使用,例如先按页码范围提取关键章节,再对超长页面做二次切分,配合os等标准库就能扩展到批量自动化场景。

(本文基于Spire.PDF库的官方API实现,代码逻辑参考自脚本之家原文:Python代码实现快速拆分PDF文件的完整指南。)
回复

使用道具 举报

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

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

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

官方核心成员

关注微信公众号

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

GMT+8, 2026-9-1 13:55 , Processed in 0.032789 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部