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)