之前分享过利用在线文件格式转换工具来拆分PDF文件的方法,昨天遇到一个尴尬的问题,利用在线转换的时候,上传速度很快,拆分也没有报错,然而拆分后的压缩包总计32M,而下载速度却只有可怜的30k,这就有点不能忍了。于是在下载进度条第一次报错后,博主开始尝试利用python来进行本地的拆分。
博主的python版本是2.7.18
,在Python 2.7中,我们可以使用PyPDF2库来拆分PDF文件,如果之前没有使用过类似的功能,那么首先当然是先安装这个库,该库独立性较强,没有多余的分支任务,所以下载速度也比较快:
pip install PyPDF2
拆分方式
方法1:按页数拆分PDF
import os
from PyPDF2 import PdfFileReader, PdfFileWriter
def split_pdf_by_pages(input_pdf_path, output_folder, pages_per_split):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
input_pdf = PdfFileReader(open(input_pdf_path, "rb"))
total_pages = input_pdf.getNumPages()
for i in range(0, total_pages, pages_per_split):
output = PdfFileWriter()
for j in range(i, min(i + pages_per_split, total_pages)):
output.addPage(input_pdf.getPage(j))
output_filename = os.path.join(
output_folder,
"split_{}-{}.pdf".format(i+1, min(i + pages_per_split, total_pages))
)
with open(output_filename, "wb") as output_stream:
output.write(output_stream)
print "Created: {}".format(output_filename)
# 使用示例
split_pdf_by_pages("input.pdf", "output_folder", 5) # 每5页拆分为一个PDF
方法2:拆分为单页PDF
def split_pdf_to_single_pages(input_pdf_path, output_folder):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
input_pdf = PdfFileReader(open(input_pdf_path, "rb"))
for i in range(input_pdf.getNumPages()):
output = PdfFileWriter()
output.addPage(input_pdf.getPage(i))
output_filename = os.path.join(output_folder, "page_{}.pdf".format(i+1))
with open(output_filename, "wb") as output_stream:
output.write(output_stream)
print "Created: {}".format(output_filename)
# 使用示例
split_pdf_to_single_pages("input.pdf", "single_pages")
方法3:按页码范围拆分
def split_pdf_by_range(input_pdf_path, output_path, start_page, end_page):
input_pdf = PdfFileReader(open(input_pdf_path, "rb"))
output = PdfFileWriter()
for i in range(start_page-1, end_page):
output.addPage(input_pdf.getPage(i))
with open(output_path, "wb") as output_stream:
output.write(output_stream)
print "Created: {}".format(output_path)
# 使用示例
split_pdf_by_range("input.pdf", "pages_3-7.pdf", 3, 7)
博主自用代码
因为博主希望拆分后的页面命名简单规律方便批量导入,所以对文件命名进行了一点修改。
import os
from PyPDF2 import PdfFileReader, PdfFileWriter
def split_pdf_by_pages(input_pdf_path, output_folder, pages_per_split):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
input_pdf = PdfFileReader(open(input_pdf_path, "rb"))
total_pages = input_pdf.getNumPages()
for i in range(0, total_pages, pages_per_split):
output = PdfFileWriter()
for j in range(i, min(i + pages_per_split, total_pages)):
output.addPage(input_pdf.getPage(j))
output_filename = os.path.join(
output_folder,
"{}.pdf".format(i+1)
)
with open(output_filename, "wb") as output_stream:
output.write(output_stream)
print "Created: {}".format(output_filename)
# 使用示例
split_pdf_by_pages("需要拆分的文件.pdf", "output", 1)