我有一项任务将 pdf 文件从一个文件夹复制到另一个文件夹。如果某些 pdf 文件超过 5MB,则需要将其拆分为最多 5MB 的部分。
我写了一个函数来处理这个问题(请不要严格判断)但问题是这个函数对于超过100页的pdf文件需要很长时间才能工作。我需要处理数十万份文档
# Переместить и разбить при необходимости pdf
def copy_and_split_pdf(source_pdf_path, output_dir, new_pdf_name, max_pdf_size_mb=5.0):
report_message = ""
result_paths_pdf = []
try:
file_size_in_mb = get_file_size_in_mb(source_pdf_path)
if file_size_in_mb > max_pdf_size_mb:
source_pdf = fitz.open(source_pdf_path)
result_pdfs_obj = []
qty_pages = source_pdf.page_count
from_page = 0
to_page = qty_pages-1
while True:
print(from_page, to_page)
new_pdf = fitz.open()
new_pdf.insert_pdf(source_pdf, from_page=from_page, to_page=to_page)
new_pdf.save("./tmp.pdf")
pdf_size_mb = get_file_size_in_mb("./tmp.pdf")
if pdf_size_mb < max_pdf_size_mb:
result_pdfs_obj.append(new_pdf)
# print(from_page, to_page, pdf_size_mb)
if to_page == qty_pages - 1:
break
from_page = to_page+1
to_page = qty_pages-1
else:
if from_page == to_page:
for pdf in result_pdfs_obj:
pdf.close()
result_pdfs_obj = []
break
to_page -= 1
new_pdf.close()
source_pdf.close()
if len(result_pdfs_obj) == 0:
report_message = f"Ошибка: не удалось разбить pdf файл {source_pdf_path} на части меньше {max_pdf_size_mb} МБ"
else:
if not os.path.exists(output_dir):
os.mkdir(output_dir)
for pdf in result_pdfs_obj:
new_pdf_save_name = f"{new_pdf_name}_{result_pdfs_obj.index(pdf)+1}.pdf"
save_path = os.path.join(output_dir, new_pdf_save_name)
pdf.save(save_path)
pdf.close()
result_paths_pdf.append(save_path)
else:
if not os.path.exists(output_dir):
os.mkdir(output_dir)
new_pdf_name = f"{new_pdf_name}.pdf"
save_path = os.path.join(output_dir, new_pdf_name)
shutil.copy2(source_pdf_path, save_path)
result_paths_pdf.append(save_path)
except Exception as e:
print(e)
report_message = f"Ошибка: {e} (Не удалось загрузить файл: {source_pdf_path})"
finally:
return report_message, result_paths_pdf
您还能如何实现这样的算法来加速该过程?
我想出了一个快速的解决方案。但我会很感激你的提示