PDF分割合并

提取指定页面并合到一起,输出到代码目录下

import os
import time
from PyPDF2 import PdfReader, PdfWriter

def extract_pages(pdf_path, page_numbers):
    # 创建PdfReader对象
    pdf_reader = PdfReader(open(pdf_path, "rb"))

    # 创建PdfWriter对象
    pdf_writer = PdfWriter()

    # 提取并合并指定页面
    try:
        for page_number in page_numbers:
            page = pdf_reader.pages[page_number - 1]  # 页面索引从0开始
            pdf_writer.add_page(page)
    except Exception as e:
        print(f"提取页面时发生错误: {e}")
        raise  # 保留异常,让程序终止

    return pdf_writer

def save_pdf(pdf_writer, output_path, increment=False):
    # 检查文件是否存在并询问用户是否替换或加编号
    while os.path.exists(output_path):
        response = input(f"文件 {output_path} 已存在,是否替换?(y或者回车) 或 输入 'n' 自动添加编号:").lower()
        if response == "y" or response == "":
            break
        elif response == "n":
            increment = True
            break
        else:
            print("无效输入,请重新选择。")

    if increment:
        base_name, ext = os.path.splitext(output_path)
        i = 1
        while os.path.exists(output_path):
            output_path = f"{base_name}_{i}{ext}"
            i += 1

    # 保存PDF文件
    with open(output_path, "wb") as out_file:
        pdf_writer.write(out_file)

def format_page_range_string(page_numbers):
    page_numbers.sort()  # 确保页码有序
    continuous_ranges = []

    current_start = page_numbers[0]
    current_end = page_numbers[0]

    for num in page_numbers[1:]:
        if num == current_end + 1:  # 如果当前页码与前一页面连续
            current_end = num  # 更新当前范围的结束页码
        else:  # 当前页码与前一页面不连续,开始新的范围
            continuous_ranges.append((current_start, current_end))
            current_start = current_end = num

    # 添加最后一个范围
    continuous_ranges.append((current_start, current_end))

    # 将连续范围转换为字符串形式并连接
    formatted_ranges = [f"{start}-{end}" if start != end else str(start) for start, end in continuous_ranges]
    return ",".join(formatted_ranges)

def parse_page_range(page_range_str):
    ranges = []
    for part in page_range_str.split(","):
        if "-" in part:
            start, end = map(int, part.split("-"))
            ranges.extend(range(start, end + 1))
        else:
            ranges.append(int(part))
    return sorted(ranges)

def list_pdf_files(directory):
    pdf_files = []
    for file in os.listdir(directory):
        if file.lower().endswith('.pdf'):
            pdf_files.append(file)
    return pdf_files

def prompt_to_continue():
    print("提取完成,是否继续提取?(回车继续/任意键退出)")
    user_input = input().strip()
    return user_input == ""

def main():
    # 获取用户选择的PDF文件
    directory = input("请输入当前目录路径或输入 'L/回车' 列出当前目录下的PDF文件:")
    if directory.lower() == 'l' or directory.lower() == "":
        pdf_files = list_pdf_files(os.getcwd())
        print("当前目录下的PDF文件:")
        for i, file in enumerate(pdf_files, start=1):
            print(f"{i}. {file}")
        selection = input("请选择一个PDF文件(输入序号):")
        if not selection.isdigit() or int(selection) < 1 or int(selection) > len(pdf_files):
            print("无效的选择,请输入有效的序号。")
            return
        pdf_path = os.path.join(os.getcwd(), pdf_files[int(selection) - 1])
    else:
        pdf_path = directory
        while not os.path.isfile(pdf_path):
            print("文件不存在,请检查路径是否正确。")
            pdf_path = input("请重新输入当前目录路径或输入 'L' 列出当前目录下的PDF文件:")
            if pdf_path.lower() == 'l':
                pdf_files = list_pdf_files(os.getcwd())
                print("当前目录下的PDF文件:")
                for i, file in enumerate(pdf_files, start=1):
                    print(f"{i}. {file}")
                selection = input("请选择一个PDF文件(输入序号):")
                if not selection.isdigit() or int(selection) < 1 or int(selection) > len(pdf_files):
                    print("无效的选择,请输入有效的序号。")
                    return
                pdf_path = os.path.join(os.getcwd(), pdf_files[int(selection) - 1])
                break

    # 获取用户选择的打印类型
    print_types = {
        "1": "黑白单面",
        "2": "黑白双面",
        "3": "彩色单面",
        "4": "彩色双面"
    }
    for key, value in print_types.items():
        print(f"{key}. {value}")
    while True:
        print_type = input("请选择打印类型(输入数字):")
        if print_type in print_types:
            break
        print("无效的打印类型,请输入正确的数字。")

    # 获取用户输入的页面范围
    while True:
        page_range = input("请输入需要提取的页面范围(例如:1,2-5):")
        try:
            page_numbers = parse_page_range(page_range)
            break
        except Exception as e:
            print(f"输入的页面范围格式错误,请输入例如:1,2-5。错误信息:{e}")

    formatted_page_range = format_page_range_string(page_numbers)

    # 提取指定页面
    pdf_writer = extract_pages(pdf_path, page_numbers)

    # 根据打印类型和页面范围命名输出文件
    output_dir, output_file = os.path.split(pdf_path)
    output_name = f"{os.path.splitext(output_file)[0]}_{print_types[print_type]}_{formatted_page_range}.pdf"
    output_path = os.path.join(output_dir, output_name)

    # 保存PDF文件
    save_pdf(pdf_writer, output_path)

    # 提示用户是否继续
    if prompt_to_continue():
        main()  # 重新调用main函数

    print("等待10秒后自动退出...")
    time.sleep(10)

if __name__ == "__main__":
    main()
  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PDF Split Merge是1个独立工具用于分割合并PDF文件,允许你分割/合并大的PDF文件到小一些的PDF文件。 PDF Split Merge提供易用的图形界面应用程序和命令行应用程序。 分割功能可以让你基于页组,页范围分割1个或多个PDF文件。 合并功能允许你快速组合所收集的PDF文件及页码设定。 PDF分割/合并功能: 无须Adobe Acrobat或者Reader 自动处理多个PDF文件分割合并过程 重新安排文件中页码顺序 基于页码或者定制的页码范围等分割PDF文件 分割1个文件到多个单页文件或者页码组合 合并1个或多个PDF文件 许多不同的分割合并方式 支持命令行和批处理 支持Win98,ME,NT4,Windows 2000及XP及2003 支持文件拖放 列表顺序组织 保存,装载和附加批处理清单 对所有产生的文件修改文件信息,例如作者,主题,名称或者关键字 注册信息: email:[email protected] sn:ARMQMLFAUBXUHCHF ******************************************************************** ==================================================================================== 注册机使用方法: 1.安装好软件后,将注册机放在安装目录的文件夹内 2.双击注册机,软件运行,看到有注册按钮后,点注册,在注册信息里填写用户名等,注册码随便填写 3.点击确定按钮,注册机将出现正确的注册码,将刚才的注册名和正确注册码填入软件即可注册。 破解补丁使用方法: 1.安装好软件后,将补丁放在安装目录文件夹内 2.运行补丁,后即可使用软件。即使软件显示未注册,但所有功能和时间限制都已经破除 ===================================================================================== 由于部分杀毒软件把注册机,补丁等做为病毒查杀,请大家用补丁或注册机时关闭杀毒软件 如不放心可以在注册完成后,用杀毒软件进行扫描查杀病毒。 =====================================================================================
可以使用 PyPDF2 库来实现 PDF分割合并。 首先需要安装 PyPDF2,可以使用以下命令进行安装: ``` pip install PyPDF2 ``` 接下来就可以开始实现分割合并功能了。 ## PDF 分割 PDF 分割可以将一个 PDF 文件拆分成多个单独的文件,可以按照页面数或者指定的页面进行拆分。 以下是一个简单的分割示例,将一个 PDF 文件按照每两页分割成一个文件: ```python import os from PyPDF2 import PdfFileReader, PdfFileWriter def split_pdf(input_path): with open(input_path, 'rb') as input_pdf: input_pdf_reader = PdfFileReader(input_pdf) output_pdf_writer = PdfFileWriter() for i in range(input_pdf_reader.getNumPages()): if i % 2 == 0: output_pdf_writer.addPage(input_pdf_reader.getPage(i)) with open(f'{os.path.splitext(input_path)[0]}_{i//2}.pdf', 'wb') as output_pdf: output_pdf_writer.write(output_pdf) output_pdf_writer = PdfFileWriter() else: output_pdf_writer.addPage(input_pdf_reader.getPage(i)) if input_pdf_reader.getNumPages() % 2 != 0: with open(f'{os.path.splitext(input_path)[0]}_{input_pdf_reader.getNumPages()//2}.pdf', 'wb') as output_pdf: output_pdf_writer.write(output_pdf) ``` 以上代码将每两页作为一组,将其拆分成多个文件。拆分后的文件名为原文件名加上下划线和组数,例如 `input_0.pdf`、`input_1.pdf` 等。 ## PDF 合并 PDF 合并可以将多个 PDF 文件合并成一个文件。 以下是一个简单的合并示例,将多个 PDF 文件合并成一个文件: ```python from PyPDF2 import PdfFileMerger def merge_pdf(input_paths, output_path): pdf_merger = PdfFileMerger() for input_path in input_paths: with open(input_path, 'rb') as input_pdf: pdf_merger.append(input_pdf) with open(output_path, 'wb') as output_pdf: pdf_merger.write(output_pdf) ``` 以上代码将所有输入的 PDF 文件按照顺序合并成一个文件,并保存到指定的输出文件中。 以上就是使用 PyPDF2 实现 PDF 分割合并的简单示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值