Tenho uma pasta contendo 600 arquivos PDF , e cada PDF tem 20 páginas . Preciso converter cada página em um PNG de alta qualidade o mais rápido possível.
Eu escrevi o seguinte script para esta tarefa:
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()
Emitir:
Este script é muito lento , especialmente ao processar um grande número de PDFs. Tentei as seguintes otimizações, mas elas não melhoraram a velocidade significativamente :
- DPI reduzido ligeiramente – Reduzido de 1200 DPI para 850 DPI . (Eu também testei 600-800 DPI.)
- Habilitado
alpha=False
emget_pixmap()
– Uso de memória reduzido. - Usado
ThreadPoolExecutor
em vez demultiprocessing.Pool
– Nenhuma melhoria significativa. - Compressão PNG reduzida – Definida
optimize=False
ao salvar imagens. - Imagens convertidas em tons de cinza – Ajudou um pouco, mas preciso de imagens coloridas para minha tarefa.
Possíveis soluções que considerei:
- Processamento paralelo de páginas em vez de arquivos – Em vez de processar um arquivo por vez, processe cada página em paralelo para utilizar totalmente os núcleos da CPU.
- Use
ProcessPoolExecutor
em vez deThreadPoolExecutor
– Como a renderização exige muita CPU , o multiprocessamento deve ser melhor. - Use JPEG em vez de PNG – JPEG é muito mais rápido de salvar e ocupa menos espaço de armazenamento, mas preciso de imagens de alta qualidade .
- Reduzir DPI para 500-600 – Oferece um equilíbrio entre velocidade e qualidade .
- Grave arquivos em lote em vez de salvar um por um – Reduz a sobrecarga de E/S.
Com o que preciso de ajuda:
- Como posso acelerar significativamente essa conversão de PDF para PNG mantendo alta qualidade de imagem?
- Existem bibliotecas ou técnicas melhores que eu deva usar?
- Existe uma maneira de utilizar totalmente os núcleos da CPU de forma eficiente?
Qualquer sugestão será muito apreciada!