基于Python(venv)按指定页码范围拆分PDF的技术需求
按指定页码范围拆分PDF的Python实现
需求说明
需要开发一个本地Python工具(基于venv环境),实现按指定页码范围拆分PDF的功能,流程如下:
- 用户操作类ILovePDF的界面(自行开发)
- 上传PDF文件
- 选择拆分的页码范围(如1-13、14-20、21-25)
- 拆分后的PDF保存到指定文件夹
此前尝试用glob仅能筛选文件名,无法实现拆分;用fitz编写的代码是按文本关键词(如Abstract)提取页面,不符合按页码拆分的需求,寻求正确实现方法。
尝试过的代码片段
筛选PDF文件的代码
import glob, os folder_path = 'C:\\work\\PythonPDF' os.chdir(folder_path) files = [file for file in glob.glob("*.pdf")] files = [file for file in files if file.__contains__('Conlclusion')] print(files)
按关键词提取页面的代码
import fitz def extract_pdfs(input_pdf_path, output_dir): document = fitz.open(input_pdf_path) pdf_count = 1 new_pdf = fitz.open() for i in range(document.page_count): page = document.load_page(i) page_text = page.get_text("text") if "Abstract" in page_text: if new_pdf.page_count > 0: new_pdf.save(f"{output_dir}/extracted_pdf_{pdf_count}.pdf") pdf_count += 1 new_pdf = fitz.open() new_pdf.insert_pdf(document, from_page=i, to_page=i) if new_pdf.page_count > 0: new_pdf.save(f"{output_dir}/extracted_pdf_{pdf_count}.pdf") print(f"Извлечено {pdf_count} отдельных PDF файлов.") input_pdf = r"C:\\work\\PythonPDF\\Filter.pdf" output_directory = r"C:\\work\\PythonPDF\\AllPdf" extract_pdfs(input_pdf, output_directory)
解决方案:基于PyMuPDF的按页码范围拆分
利用PyMuPDF(即fitz库)的insert_pdf方法,可直接指定页码范围实现精准拆分,核心逻辑如下:
核心实现代码
import fitz import os def split_pdf_by_page_ranges(input_pdf_path, output_dir, page_ranges): """ 按指定页码范围拆分PDF :param input_pdf_path: 输入PDF文件路径 :param output_dir: 输出文件夹路径 :param page_ranges: 页码范围列表,元素为元组(0索引),如[(0,12), (13,19), (20,24)]对应1-13、14-20、21-25 """ # 确保输出文件夹存在 os.makedirs(output_dir, exist_ok=True) with fitz.open(input_pdf_path) as source_doc: for idx, (start_page, end_page) in enumerate(page_ranges, 1): # 校验页码范围合法性 start_page = max(0, start_page) end_page = min(source_doc.page_count - 1, end_page) if start_page > end_page: print(f"跳过无效页码范围:{start_page+1}-{end_page+1}") continue # 创建新PDF并插入指定页码范围 target_doc = fitz.open() target_doc.insert_pdf(source_doc, from_page=start_page, to_page=end_page) # 保存拆分后的文件 output_file = os.path.join(output_dir, f"拆分文档_{idx}.pdf") target_doc.save(output_file) target_doc.close() print(f"已生成:{output_file}") # 示例调用 if __name__ == "__main__": INPUT_PDF = r"C:\work\PythonPDF\Filter.pdf" OUTPUT_DIR = r"C:\work\PythonPDF\拆分结果" # 转换用户输入的1起始页码为0起始索引 USER_PAGE_RANGES = [(0,12), (13,19), (20,24)] split_pdf_by_page_ranges(INPUT_PDF, OUTPUT_DIR, USER_PAGE_RANGES)
关键说明
- 页码索引转换:PyMuPDF采用0起始索引,若界面接收用户输入的1起始页码,需做
用户起始页码-1、用户结束页码-1的转换。 - 边界校验:自动修正超出文档总页数的页码范围,避免报错。
- 文件夹自动创建:无需手动提前创建输出文件夹,代码会自动生成。
内容的提问来源于stack exchange,提问作者zobomber
相关产品推荐
相关产品推荐

