前言
实际工作中经常拿到几十页甚至上百页的 pdf——合并的季度报告、扫描的合同、批量导出的发票。接收方往往只需要其中几页:把单页拆成独立文件分发,或者抽取某个页码区间交给不同的人处理。手动用 pdf 编辑器拆分既低效又难以批量。用 python 可以按页拆分整个文档、提取指定页码、甚至把一个超长页面切成多页,方便接入自动化流程。本文以 spire.pdf for python 为例,演示这三种常见的拆分方式。
为什么用 python 拆分 pdf
通过脚本拆分 pdf 有几个实际好处:
- 批量处理:一次脚本处理成百上千个文件,无需人工逐个操作。
- 拆分粒度灵活:既可以整档逐页拆,也可以只提取指定页,或对单个超长页面再切分。
- 易于集成:拆分只是流水线中的一步,可以和下载、归档、邮件发送等操作衔接。
环境准备
安装 spire.pdf 库:
pip install spire.pdf
在脚本中引入模块:
from spire.pdf import * from spire.pdf.common import *
将 pdf 拆分为单页文档
最直接的拆分方式是让每一页都变成一个独立的 pdf 文件。pdfdocument.split() 用一个文件名模板即可完成,无需逐页操作:
from spire.pdf import *
from spire.pdf.common import *
# 加载 pdf 文档
doc = pdfdocument()
doc.loadfromfile("sample.pdf")
# 按文件名模板拆分,每一页生成一个独立 pdf
doc.split("splitdocument-{0}.pdf")
doc.close()
split() 接收一个包含 {0} 占位符的文件名模板,占位符会被替换成页码索引(从 0 开始)。一个 10 页的文档执行后会生成 splitdocument-0.pdf 到 splitdocument-9.pdf 共 10 个单页文件。拆分完成后调用 close() 释放文档占用的资源。
提取指定页面生成新 pdf
更多场景是不需要全部页面,只挑出某几页组成新文档。思路是:新建一个 pdfdocument,为每个要提取的源页面添加一个同尺寸的新页面,再把源页内容绘制进去:
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()
pages.add() 的第一个参数传入源页面的 size,保证新页面与源页面尺寸一致;pdfmargins(0.0) 把新页面边距设为 0,避免内容错位。createtemplate() 为源页面生成一个绘制模板,draw() 把它原样画到新页面上,内容和排版都不会丢失。循环范围 range(1, 3) 表示提取第 2、3 页——改这个范围就能提取任意页码组合。
将一个长页面拆分为多页
还有一类特殊需求:源 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 表示按页面高度截断。由于新页面高度是源页的一半,一页长内容会被平铺到两个标准页上;把高度除数改小,还能切成更多份。
实用提示
- 输出位置:
split()的文件名模板里可以带上路径前缀(如"output/splitdocument-{0}.pdf"),让拆分结果直接输出到指定目录。 - 页码从 0 开始:提取页面时先用
doc.pages.count确认总页数,再决定循环范围,避免索引越界。 - 拆分粒度:长页切分时,
height除以的数字越小,切出的页数越多,可按实际内容高度调整。 - 资源释放:源文档和目标文档用完都调用
close(),批量处理时尤其重要。 - 免费版限制:spire.pdf 的免费版对处理的页数有限制,大批量或大文档场景需注意这一约束。
总结
本文介绍了用 python 拆分 pdf 文档的三种常见方式:用 split() 把整个文档逐页拆成单页文件,用 createtemplate().draw() 把指定页码提取成新文档,以及借助 pdflayouttype.paginate 自动分页把一个长页面切成多页。结合文件遍历和页码计算,这些操作可以轻松嵌入批量拆分、按人分发文档等自动化流程中。
以上就是使用python拆分和提取pdf页面的方法示例的详细内容,更多关于python拆分和提取pdf页面的资料请关注代码网其它相关文章!
发表评论