编辑
2024-12-26
技术
00
请注意,本文编写于 416 天前,最后修改于 416 天前,其中某些信息可能已经过时。

注:需要先安装Ghostscript并设置环境变量

python
from PyPDF2 import PdfReader, PdfWriter import os #-----函数层开始----- def compress_pdf_with_ghostscript(input_pdf, output_pdf): """ 使用 Ghostscript 压缩 PDF 文件 :param input_pdf: 输入 PDF 文件路径 :param output_pdf: 输出压缩后的 PDF 文件路径 """ command = f"gswin64 -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile={output_pdf} {input_pdf}" os.system(command) print(f"压缩后的 PDF 文件已保存为:{output_pdf}") def extract_text_from_page(page): """ 提取 PDF 页面中的文本内容。 """ return page.extract_text() def contains_container_number(text): """ 判断页面文本是否包含集装箱号。 假设集装箱号是由字母和数字组成的特定格式(例如:ABC1234567)。 """ import re # 集装箱号的正则表达式(假设是4个字母+7个数字) pattern = r'[A-Z]{4}\d{7}' match = re.search(pattern, text) return match.group(0) if match else None def split_pdf_by_container_number(input_pdf, output_folder): """ 按集装箱号分割 PDF,并将没有集装箱号的页面与前一个有集装箱号的页面合并。 """ # 读取 PDF 文件 reader = PdfReader(input_pdf) total_pages = len(reader.pages) writer = None current_container_number = None output_files = [] for page_number in range(total_pages): page = reader.pages[page_number] text = extract_text_from_page(page) # 检查当前页面是否包含集装箱号 container_number = contains_container_number(text) if container_number: # 如果当前页面包含集装箱号 if writer: # 保存之前的 PDF 文件 output_file = f"{output_folder}/{current_container_number}货票.pdf" with open(output_file, "wb") as f: writer.write(f) output_files.append(output_file) # 更新当前集装箱号并创建新的 PDF 写入器 current_container_number = container_number writer = PdfWriter() writer.add_page(page) else: # 如果当前页面没有集装箱号,将其添加到当前的 PDF 中 if writer: writer.add_page(page) else: print(f"警告:第 {page_number + 1} 页没有集装箱号,且没有前一个页面可合并!") # 保存最后一个 PDF if writer and current_container_number: output_file = f"{output_folder}/{current_container_number}货票.pdf" with open(output_file, "wb") as f: writer.write(f) output_files.append(output_file) print("分割完成!生成的文件:") for file in output_files: print(file) #------函数层结束---------- input_pdf = [file for file in os.listdir() if file.lower().endswith('.pdf')][0] output_pdf = "compressed.pdf" #执行压缩 compress_pdf_with_ghostscript(input_pdf, output_pdf) input_pdf= output_pdf output_folder = "output" # 输出文件夹路径 if not os.path.exists(output_folder): os.makedirs(output_folder) #主函数 split_pdf_by_container_number(input_pdf, output_folder)

本文作者:ivan

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!