我有一个文件夹,里面有600 个 PDF 文件,每个 PDF 有20 页。我需要尽快将每页转换为高质量的 PNG 。
我为此任务编写了以下脚本:
import os
import multiprocessing
import fitz # PyMuPDF
from PIL import Image
def process_pdf(pdf_path, output_folder):
try:
pdf_name = os.path.splitext(os.path.basename(pdf_path))[0]
pdf_output_folder = os.path.join(output_folder, pdf_name)
os.makedirs(pdf_output_folder, exist_ok=True)
doc = fitz.open(pdf_path)
for i, page in enumerate(doc):
pix = page.get_pixmap(dpi=850) # Render page at high DPI
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
img_path = os.path.join(pdf_output_folder, f"page_{i+1}.png")
img.save(img_path, "PNG")
print(f"Processed: {pdf_path}")
except Exception as e:
print(f"Error processing {pdf_path}: {e}")
def main():
input_folder = r"E:\Desktop\New folder (5)\New folder (4)"
output_folder = r"E:\Desktop\New folder (5)\New folder (5)"
pdf_files = [os.path.join(input_folder, f) for f in os.listdir(input_folder) if f.lower().endswith(".pdf")]
with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as pool:
pool.starmap(process_pdf, [(pdf, output_folder) for pdf in pdf_files])
print("All PDFs processed successfully!")
if __name__ == "__main__":
main()
问题:
这个脚本太慢了,特别是在处理大量 PDF 时。我尝试了以下优化,但速度并没有显著提高:
- 稍微降低 DPI – 从1200 DPI降低到850 DPI。(我也测试了 600-800 DPI。)
- 启用 – 减少内存使用量
alpha=False
。get_pixmap()
- 用来
ThreadPoolExecutor
代替multiprocessing.Pool
– 没有重大改进。 - 减少 PNG 压缩
optimize=False
–保存图像时设置。 - 将图像转换为灰度- 有点帮助,但我的任务需要彩色图像。
我考虑过的可能的解决方案:
- 并行处理页面而不是文件——不是一次处理一个文件,而是并行处理每个页面以充分利用 CPU 核心。
- 使用
ProcessPoolExecutor
而不是ThreadPoolExecutor
– 由于渲染是CPU 密集型的,因此多处理应该更好。 - 使用 JPEG 而不是 PNG – JPEG保存速度更快,占用存储空间更少,但我需要高质量的图像。
- 将 DPI 降低至 500-600 – 在速度和质量之间实现平衡。
- 批量写入文件而不是逐个保存- 减少 I/O 开销。
我需要帮助:
- 如何在保持高图像质量的同时显著加快PDF 到 PNG 的转换速度 ?
- 是否有更好的库或技术我应该使用?
- 有没有办法可以充分利用 CPU 内核?
任何建议都将不胜感激!