资讯动态

Python办公17:暴力拆分——按页数或指定范围提取 PDF 核心页面

发布时间:2026/8/28 7:04:39 来源:尧图企业网站定制
17PDF 暴力拆分——按页数或指定范围提取 PDF 核心页面第三阶段PDF 与图片处理16-22场景引入收到一份 200 页的培训教材但你只需要第 15-30 页的内容。或者需要把一份合同的每个章节拆分为独立文件分发给不同负责人。手动操作需要打开 PDF选择页面范围导出——每次只能处理一部分。本节教你用 Python 快速拆分和提取。技术原理核心操作源 PDF → 按页拆分 → 按范围提取 → 多个独立 PDF使用pypdf的PdfReader读取页面PdfWriter写入指定页面。环境准备pipinstallpypdf完整代码importosfrompypdfimportPdfReader,PdfWriterfrompathlibimportPath# 方案 1提取指定页码范围 defextract_pages(input_pdf,start_page,end_page,output_file): 从 PDF 中提取指定范围的页面 参数: input_pdf: 源 PDF 文件 start_page: 起始页码从 1 开始 end_page: 结束页码包含 output_file: 输出文件名 readerPdfReader(input_pdf)totallen(reader.pages)# 验证页码范围ifstart_page1orend_pagetotal:print(f错误: 文件共{total}页请求范围{start_page}-{end_page})returnwriterPdfWriter()foriinrange(start_page-1,end_page):# 转为 0-based 索引writer.add_page(reader.pages[i])withopen(output_file,wb)asf:writer.write(f)print(f已提取第{start_page}-{end_page}页 →{output_file})# 方案 2逐页拆分 defsplit_pdf_by_page(input_pdf,output_dir逐页拆分): 将 PDF 的每一页拆分为独立文件 readerPdfReader(input_pdf)output_pathPath(output_dir)output_path.mkdir(parentsTrue,exist_okTrue)base_namePath(input_pdf).stemfori,pageinenumerate(reader.pages):writerPdfWriter()writer.add_page(page)output_fileoutput_path/f{base_name}_第{i1}页.pdfwithopen(output_file,wb)asf:writer.write(f)print(f逐页拆分完成:{len(reader.pages)}页 →{output_dir}/)# 方案 3按指定块大小拆分 defsplit_pdf_by_chunks(input_pdf,chunk_size,output_dir分块拆分): 按指定页数拆分如每 10 页一个文件 参数: input_pdf: 源 PDF chunk_size: 每个文件的页数 output_dir: 输出目录 readerPdfReader(input_pdf)output_pathPath(output_dir)output_path.mkdir(parentsTrue,exist_okTrue)totallen(reader.pages)base_namePath(input_pdf).stem chunk_count0forstartinrange(0,total,chunk_size):endmin(startchunk_size,total)writerPdfWriter()foriinrange(start,end):writer.add_page(reader.pages[i])output_fileoutput_path/f{base_name}_第{start1}-{end}页.pdfwithopen(output_file,wb)asf:writer.write(f)chunk_count1print(f已拆分: 第{start1}-{end}页)print(f\n分块拆分完成:{chunk_count}个文件)# 方案 4按章节/书签拆分 defsplit_pdf_by_outline(input_pdf,output_dir按章节拆分): 按 PDF 的书签大纲拆分为独立章节文件 readerPdfReader(input_pdf)output_pathPath(output_dir)output_path.mkdir(parentsTrue,exist_okTrue)base_namePath(input_pdf).stem outlinereader.outline# 提取书签信息bookmarks[]foriteminoutline:ifisinstance(item,dict)and/Titleinitem:titleitem[/Title]page_numNoneif/Destinitem:destitem[/Dest]ifisinstance(dest,list)anddest[0]:page_numreader.get_destination_page_number(item)bookmarks.append({title:title,page:page_num})ifnotbookmarks:print(该 PDF 没有书签/大纲)return# 按书签拆分foridx,bminenumerate(bookmarks):ifbm[page]isNone:continuestartbm[page]# 下一个书签的页码 - 1 作为结束ifidx1len(bookmarks)andbookmarks[idx1][page]isnotNone:endbookmarks[idx1][page]-1else:endlen(reader.pages)-1writerPdfWriter()foriinrange(start,end1):writer.add_page(reader.pages[i])safe_titlebm[title].replace(/,_).replace(\\,_)output_fileoutput_path/f{safe_title}.pdfwithopen(output_file,wb)asf:writer.write(f)print(f已拆分章节:{bm[title]}(第{start1}-{end1}页))print(f\n按章节拆分完成:{output_dir}/)# 使用示例 if__name____main__:PDF_FILE培训教材_200页.pdf# 方案 1提取第 15-30 页extract_pages(PDF_FILE,15,30,培训教材_核心章节.pdf)# 方案 2逐页拆分# split_pdf_by_page(PDF_FILE)# 方案 3每 10 页一个文件# split_pdf_by_chunks(PDF_FILE, chunk_size10)# 方案 4按书签拆分# split_pdf_by_outline(PDF_FILE)常见问题Q1提取后页面空白pypdf可能无法正确处理某些特殊 PDF如扫描件、加密文件。尝试先解密ifreader.is_encrypted:reader.decrypt()Q2按书签拆分时没有提取到书签有些 PDF 的书签存储在非标准位置。可以使用pdfplumber获取更多信息importpdfplumberwithpdfplumber.open(pdf_file)aspdf:tocpdf.tocprint(toc)总结拆分方式函数说明指定范围extract_pages()提取 start-end 页逐页拆分split_pdf_by_page()每页一个文件分块拆分split_pdf_by_chunks()每 N 页一个文件按书签split_pdf_by_outline()按章节拆分本节掌握了 PDF 拆分与页面提取的多种方法。下一节预告18PDF 转 Word——利用 OCR 技术批量提取不可编辑的文档内容

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价