PDF分割合并

news/2024/10/9 9:51:37/

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

python">import os
import time
from PyPDF2 import PdfReader, PdfWriterdef 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_writerdef 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 == "":breakelif response == "n":increment = Truebreakelse:print("无效输入,请重新选择。")if increment:base_name, ext = os.path.splitext(output_path)i = 1while 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_filesdef 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("无效的选择,请输入有效的序号。")returnpdf_path = os.path.join(os.getcwd(), pdf_files[int(selection) - 1])else:pdf_path = directorywhile 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("无效的选择,请输入有效的序号。")returnpdf_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:breakprint("无效的打印类型,请输入正确的数字。")# 获取用户输入的页面范围while True:page_range = input("请输入需要提取的页面范围(例如:1,2-5):")try:page_numbers = parse_page_range(page_range)breakexcept 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()

http://www.ppmy.cn/news/1441406.html

相关文章

锂电池SOH预测 | 基于CNN的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…

“一带一路”是创新之路。推进“一带一路”建设应促进科技同()、科技同金融深度融合。

“一带一路”是创新之路。推进“一带一路”建设应促进科技同()、科技同金融深度融合。 点击查看答案 A 人才 B 生态 C 产业 D 社会 中国在“一带一路”国家承接大型工程项目方面&#xff0c;资金主要分布在()地区。 A 中东欧 B 东盟 C 南亚 D 西 拓展“一带一路”国际合作…

Linux安装python3环境

搭建Python环境 Linux 中默认自带了 python2 1、进入管理员的身份&#xff0c;先安装依赖的编译环境 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc2、使用 w…

【go零基础】go-zero从零基础学习到实战教程 - 0环境配置

是个前端&#xff0c;最近开始学习go&#xff0c;后端除node外基本0基础&#xff0c;所以学习曲线有点绕&#xff0c;目标是个基础的服务端demo&#xff0c;搞个api服务后台&#xff0c;包含基础的用户登录、文章发布和写文章、权限控制&#xff0c;差不多就是个完整博客系统。…

Java常见排序

1、冒泡排序&#xff08;从小到大排序&#xff09; 相邻的元素两两比较&#xff0c;小的放左边&#xff0c;大的放右边 第一轮比较完毕之后&#xff0c;最大值就已经确定了&#xff0c;第二轮比第一轮少循环一次&#xff0c;后面以此类推 如果数据中有n个数据&#xff0c;我…

物联网实战--平台篇之(一)架构设计

本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 一、平台简介 物联网平台这个概念比较宽&#xff0c;大致可以分为两大类&#x…

C#Guid(全局唯一标识符)

当使用C#开发应用程序时&#xff0c;Guid&#xff08;全局唯一标识符&#xff09;是一个常用的数据类型。它用于生成、操作和表示唯一的标识符。下面是对Guid的详细解释&#xff0c;并附带一些示例说明&#xff1a; 定义和结构&#xff1a; Guid 是 System.Guid 结构的别名。它…

React中,双花括号和单花括号的区别

在React中&#xff0c;花括号 {} 用于在JSX中插入JavaScript表达式。 单花括号 {}&#xff1a;通常用于在JSX中嵌入JavaScript表达式。这些表达式可以是变量、函数调用、对象字面量、数组等。React会评估这些表达式&#xff0c;并将结果插入到JSX中。 例如&#xff0c;在你的代…