From 3c34a7870076a7ce6a45d348983445c1d4b1dcde Mon Sep 17 00:00:00 2001 From: "vladimir.buzalka" Date: Sun, 14 Dec 2025 19:07:10 +0100 Subject: [PATCH] z230 --- MakeSmallerPDF/MakeSmallerPDF.py | 105 +++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 MakeSmallerPDF/MakeSmallerPDF.py diff --git a/MakeSmallerPDF/MakeSmallerPDF.py b/MakeSmallerPDF/MakeSmallerPDF.py new file mode 100644 index 0000000..0a589b3 --- /dev/null +++ b/MakeSmallerPDF/MakeSmallerPDF.py @@ -0,0 +1,105 @@ +from pdf2image import convert_from_path +from PIL import Image +import img2pdf +import os +import pathlib +import glob + +# *** KONFIGURACE *** +# Cesta ke složce, kde se nacházejí PDF soubory +INPUT_DIR = r"u:\Dropbox\Ordinace\Dokumentace_ke_zpracování\AdobeMakeSmaller" +# Cesta k binární složce Poppleru (musí být správná, aby to fungovalo) +POPPLER_BIN_PATH = r'c:\poppler\library\bin' +# Rozlišení pro čitelnost (300 DPI by mělo být perfektní pro text) +TARGET_DPI = 200 + + +# ******************* + +def create_min_bw_pdf(input_pdf_path, output_pdf_path, dpi): + """ + Konvertuje jeden PDF soubor na nový, maximálně zmenšený, černobílý PDF. + """ + temp_image_path = "temp_bw_image_for_batch.png" + success = False + + print(f"\n--- Zpracovávám: {pathlib.Path(input_pdf_path).name} (DPI: {dpi}) ---") + + try: + # 1. Převod PDF na obrázek (bitmapu) + # Používáme grayscale=True, ale hlavní komprese přijde v kroku 2 + images = convert_from_path( + input_pdf_path, + dpi=dpi, + grayscale=True, + thread_count=1, + poppler_path=POPPLER_BIN_PATH + ) + + if not images: + print(f"⚠️ Chyba: Nepodařilo se konvertovat stránku z {input_pdf_path}.") + return success + + # 2. Zpracování a převod na 1-bitový ČERNOBÍLÝ režim (maximální komprese barev) + image = images[0] + bw_image = image.convert('1') + + # Uložení do dočasného PNG souboru (nejlepší pro 1-bitový obraz) + bw_image.save(temp_image_path, format='PNG', optimize=True) + + # 3. Konverze dočasného obrázku zpět na PDF (přepisování originálu) + # Důležité: 'output_pdf_path' je stejné jako 'input_pdf_path' + with open(output_pdf_path, "wb") as f: + f.write(img2pdf.convert(temp_image_path)) + + # Zpráva o úspěchu a úspoře + original_size = os.path.getsize(input_pdf_path) + new_size = os.path.getsize(output_pdf_path) + reduction = (1 - new_size / original_size) * 100 + + print( + f"✅ Úspěch! Původní: {original_size / 1024:.2f} KB, Nový: {new_size / 1024:.2f} KB (Úspora: {reduction:.2f} %)") + success = True + + except Exception as e: + print(f"❌ Nastala chyba při zpracování {input_pdf_path}: {e}") + print("Zkontrolujte, zda je Poppler cesta správná a máte práva k zápisu.") + + finally: + # Vyčištění dočasného souboru + if os.path.exists(temp_image_path): + os.remove(temp_image_path) + return success + + +def process_directory(input_directory, dpi): + """ + Prochází zadaný adresář, hledá PDF a volá konverzní funkci. + """ + if not os.path.isdir(input_directory): + print(f"Chyba: Adresář nebyl nalezen na cestě: {input_directory}") + return + + # Najdeme všechny soubory s příponou .pdf (ignorujeme velikost písmen) + pdf_files = glob.glob(os.path.join(input_directory, '*.pdf'), recursive=False) + + if not pdf_files: + print(f"Ve složce {input_directory} nebyly nalezeny žádné PDF soubory.") + return + + print(f"\nNalezeno {len(pdf_files)} souborů ke zpracování v {input_directory}.") + print("----------------------------------------------------------------------") + + total_processed = 0 + for file_path in pdf_files: + # Vstupní cesta je zároveň výstupní cestou (přepisování) + if create_min_bw_pdf(file_path, file_path, dpi): + total_processed += 1 + + print("----------------------------------------------------------------------") + print(f"Konec zpracování. Celkem úspěšně zpracováno: {total_processed}/{len(pdf_files)} souborů.") + + +# --- SPUSŤTE POUZE, AŽ BUDETE PŘIPRAVENI PŘEPSAT SOUBORY --- +print(f"!!! POUŽÍVÁ SE DPI: {TARGET_DPI}. ORIGINÁLNÍ SOUBORY BUDOU PŘEPSÁNY !!!") +process_directory(INPUT_DIR, TARGET_DPI) \ No newline at end of file