PDF分割合并

server/2024/10/19 23:29:01/

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

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/server/21145.html

相关文章

python facebook business SDK campaign 广告复制方法

facebook广告复制调试了一天&#xff0c;特此记录&#xff0c;广告复制分为两个步骤&#xff1a; 第一步&#xff1a;使用campaign.create_copy()复制广告系列。 第二步&#xff1a;复制源广告广告集&#xff08;ad_set&#xff09;如果广告集需要修改&#xff0c;使用api_upd…

Git系列:Refs与Reflog

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

路透社:美国SEC将拒绝以太坊ETF

4月25日&#xff0c;据路透社报道&#xff0c;美国SEC在下个月将拒绝以太坊现货ETF申请。根据4位知情人士表示&#xff0c;在最近几周与美国证券交易委员会&#xff08;SEC&#xff09;进行了会议之后&#xff0c;美国发行商和其他公司预计SEC将拒绝他们推出与以太坊价格挂钩的…

【C#】.net core 6.0 MVC返回JsonResult显示API接口返回值不可被JSON反序列化

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景API接口接口代码请求失败原因排查调通效果 常见返回类型相关文章 …

自适应视图增强的谣言检测图对比学习方法

论文标题&#xff1a;Propagation Tree Is Not Deep: Adaptive Graph Contrastive Learning Approach for Rumor Detection 论文链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/27757 论文来源&#xff1a;AAAI 2024 一、概述 现有的一些谣言检测研究表明…

leetcode 边双连通tarjan(python)

按照tarjan寻找强连通分量的模板&#xff0c;稍微改一下。 先回顾一下强连通分量&#xff0c;首先维护dnf和low两个列表&#xff0c;dnf【i】表示第i个节点的编号&#xff0c;low【i】表示第i个节点能到达的最小节点编号。例如节点0可以到1,节点1能到达2,节点2能到达0&#xf…

AutoInt模型——Transformer玩特征交互

浅层模型的FM, FFM, HOFM, FwFM到深层模型的DNN, PNN, NFM, AFM, DeepFM, DCN, xDeepFM, FiBiNet等&#xff0c; 关于特征交叉方向的模型paper&#xff0c; FiBinet模型通过SENET动态选择有用的交互特征&#xff0c; 然后再用一个双线性交互进行增强提高。在模型上并没有引入很…

uniapp问题归类

最近使用uniapp中&#xff0c;遇到了一些问题&#xff0c;这边mark下。 1. 启动页变形 设置启动页的时候发现在部分android手机上启动页被拉伸了&#xff0c;最后看了下官方建议使用9.png图 生成9.png地址&#xff0c;推荐图片大小为1080x2340 uniapp推荐官方地址传送门 我…