用AI生成的一个python 的 pdf合并程序,自用。
因为工作需要,有数百pdf文档需要合并每个文档的第一页。找了几个现成的应用,要么收费要么就是需要每个文档都手动设置原文档的页码范围,感觉太麻烦,所以就试着用AI写了个。大概可能是一次性应用吧。哈。放这里收藏一下备用。
import os
import platform
from PyPDF2 import PdfReader, PdfWriter
from tkinter import Tk, filedialog, simpledialog, messagebox
import subprocess
def merge_pages(input_folder, output_file, start_page, end_page):
pdf_writer = PdfWriter()
for item in os.listdir(input_folder):
if item.endswith('.pdf'):
pdf_path = os.path.join(input_folder, item)
print(f"Processing {pdf_path}...")
pdf_reader = PdfReader(pdf_path)
pages_to_merge = range(start_page - 1, end_page if end_page != 0 else len(pdf_reader.pages))
for page_num in pages_to_merge:
if page_num < len(pdf_reader.pages):
pdf_writer.add_page(pdf_reader.pages[page_num])
with open(output_file, 'wb') as output_pdf:
pdf_writer.write(output_pdf)
print(f"合并后的文档已保存到 {output_file}")
def select_folder():
root = Tk()
root.withdraw() # 隐藏Tk主窗口
folder_selected = filedialog.askdirectory()
root.destroy()
return folder_selected
def save_file():
root = Tk()
root.withdraw() # 隐藏Tk主窗口
file_selected = filedialog.asksaveasfilename(defaultextension=".pdf", filetypes=[("PDF files", "*.pdf")])
root.destroy()
return file_selected
def get_page_range():
root = Tk()
root.withdraw() # 隐藏Tk主窗口
start_page = simpledialog.askinteger("页码范围", "请输入起始页码 (默认为 1):", initialvalue=1)
end_page = simpledialog.askinteger("页码范围", "请输入结束页码 (输入 0 表示合并到最后一页):", initialvalue=1)
root.destroy()
return start_page, end_page
def open_output_folder(output_file):
output_folder = os.path.dirname(output_file)
if platform.system() == "Windows":
os.startfile(output_folder)
elif platform.system() == "Darwin": # macOS
subprocess.Popen(["open", output_folder])
else: # Linux and other
subprocess.Popen(["xdg-open", output_folder])
# 获取输入文件夹和输出文件路径
input_folder = select_folder()
if not input_folder:
messagebox.showerror("错误", "没有选择文件夹")
exit()
output_file = save_file()
if not output_file:
messagebox.showerror("错误", "没有选择输出文件")
exit()
try:
start_page, end_page = get_page_range()
if start_page is None or end_page is None:
messagebox.showerror("错误", "页码未输入正确")
exit()
if start_page < 1 or end_page < 0:
raise ValueError("页码范围必须为起始页码≥1而且结束页码≥0")
if start_page > end_page and end_page != 0:
raise ValueError("起始页码不能大于结束页码")
print(f"Selected input folder: {input_folder}")
print(f"Selected output file: {output_file}")
print(f"Selected page range: {start_page}到{end_page if end_page != 0 else '最后一页'}")
merge_pages(input_folder, output_file, start_page, end_page)
open_output_folder(output_file)
except ValueError as e:
messagebox.showerror("错误", f"页码输入错误: {e}")