注:需要先安装Ghostscript并设置环境变量
pythonfrom 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 许可协议。转载请注明出处!