You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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)

关键说明

  1. 页码索引转换:PyMuPDF采用0起始索引,若界面接收用户输入的1起始页码,需做用户起始页码-1、用户结束页码-1的转换。
  2. 边界校验:自动修正超出文档总页数的页码范围,避免报错。
  3. 文件夹自动创建:无需手动提前创建输出文件夹,代码会自动生成。

内容的提问来源于stack exchange,提问作者zobomber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:21:02