import fitz # PyMuPDF from PIL import Image import io import os import shutil # --- VAŠE VÍTĚZNÉ NASTAVENÍ --- CHOSEN_DPI = 150 CHOSEN_THRESHOLD = 150 # Cesty INPUT_FOLDER = r'u:\Dropbox\Ordinace\Dokumentace_ke_zpracování\AdobeMakeSmaller' OUTPUT_SUBFOLDER = '_HOTOVO' def process_all_files(): # Vytvoření výstupní složky output_dir = os.path.join(INPUT_FOLDER, OUTPUT_SUBFOLDER) if not os.path.exists(output_dir): os.makedirs(output_dir) # Nalezení všech PDF (ignorujeme již hotové v podsložkách) files = [f for f in os.listdir(INPUT_FOLDER) if f.lower().endswith('.pdf')] print(f"Startuji zpracování {len(files)} souborů.") print(f"Nastavení: DPI={CHOSEN_DPI}, Práh={CHOSEN_THRESHOLD}") print("-" * 60) success_count = 0 for filename in files: input_path = os.path.join(INPUT_FOLDER, filename) # Přidáme '_bw' do názvu, aby se to nepletlo name_without_ext = os.path.splitext(filename)[0] output_filename = f"{name_without_ext}_bw.pdf" output_path = os.path.join(output_dir, output_filename) try: # Zpracování jednoho souboru process_single_pdf(input_path, output_path) # Výpis výsledku orig_size = os.path.getsize(input_path) / 1024 new_size = os.path.getsize(output_path) / 1024 ratio = (1 - (new_size / orig_size)) * 100 print(f"[OK] {filename}") print(f" {orig_size:.1f} kB -> {new_size:.1f} kB (úspora {ratio:.0f} %)") success_count += 1 # --- VOLITELNÉ: SMAZÁNÍ ORIGINÁLU --- # Pokud chcete, aby skript po úspěchu smazal původní velký soubor, # odkomentujte následující řádek (odstraňte mřížku #): # os.remove(input_path) except Exception as e: print(f"[CHYBA] {filename}: {e}") print("-" * 60) print(f"Hotovo. Úspěšně zpracováno {success_count} z {len(files)} souborů.") print(f"Výstupy jsou ve složce: {output_dir}") def process_single_pdf(input_path, output_path): doc = fitz.open(input_path) new_doc = fitz.open() for page in doc: # 1. Renderování stránky (Downsampling na 150 DPI) zoom = CHOSEN_DPI / 72 matrix = fitz.Matrix(zoom, zoom) pix = page.get_pixmap(matrix=matrix, colorspace=fitz.csGRAY) # 2. Binarizace (Threshold 150) img = Image.frombytes("L", [pix.width, pix.height], pix.samples) img_bw = img.point(lambda x: 255 if x > CHOSEN_THRESHOLD else 0, mode='1') # 3. Uložení 1-bitového obrázku buffer = io.BytesIO() img_bw.save(buffer, format="PNG", optimize=True) # 4. Vložení do nového PDF # Zachováme fyzické rozměry stránky (aby se netiskla jako známka) new_page = new_doc.new_page(width=page.rect.width, height=page.rect.height) new_page.insert_image(page.rect, stream=buffer.getvalue()) # Uložení s maximální kompresí new_doc.save(output_path, garbage=4, deflate=True) new_doc.close() doc.close() if __name__ == "__main__": process_all_files()