import fitz # PyMuPDF from PIL import Image import io import os # --- NASTAVENÍ --- INPUT_FILE = r'u:\Dropbox\Ordinace\Dokumentace_ke_zpracování\AdobeMakeSmaller\90df6f84-72c8-40b8-8993-ce7e244b0cea.pdf' # 1. Prahové hodnoty: Zúžíme výběr na nejpravděpodobnější rozsah THRESHOLDS = [110, 130, 150, 170] # 2. DPI Varianty k testování # 131 = Přesná polovina originálu (váš nápad) # 150 = Standard # 200 = Vysoká kvalita # 262 = Originál (žádná ztráta detailů, jen ztráta barev) DPI_LIST = [131, 150, 200, 262] def generate_final_matrix(): if not os.path.exists(INPUT_FILE): print(f"Chyba: Soubor nenalezen.") return # Příprava složky base_folder = os.path.dirname(INPUT_FILE) filename = os.path.basename(INPUT_FILE) name_without_ext = os.path.splitext(filename)[0] output_dir = os.path.join(base_folder, "_TEST_DPI_MATH") if not os.path.exists(output_dir): os.makedirs(output_dir) print(f"Generuji varianty do: {output_dir}") print("-" * 80) print(f"{'DPI':<5} | {'Práh':<6} | {'Velikost':<12} | {'Poznámka'}") print("-" * 80) doc = fitz.open(INPUT_FILE) for dpi in DPI_LIST: # Přednačtení stránek v daném DPI pages_at_dpi = [] for page in doc: zoom = dpi / 72 matrix = fitz.Matrix(zoom, zoom) pix = page.get_pixmap(matrix=matrix, colorspace=fitz.csGRAY) pages_at_dpi.append(pix) for t in THRESHOLDS: new_doc = fitz.open() for i, pix in enumerate(pages_at_dpi): # Binarizace img = Image.frombytes("L", [pix.width, pix.height], pix.samples) img_bw = img.point(lambda x: 255 if x > t else 0, mode='1') # Uložení buffer = io.BytesIO() img_bw.save(buffer, format="PNG", optimize=True) # Vložení zpět orig_rect = doc[i].rect new_page = new_doc.new_page(width=orig_rect.width, height=orig_rect.height) new_page.insert_image(orig_rect, stream=buffer.getvalue()) # Uložení output_name = f"dpi{dpi}_t{t}.pdf" output_path = os.path.join(output_dir, output_name) new_doc.save(output_path, garbage=4, deflate=True) new_doc.close() # Výpis size_kb = os.path.getsize(output_path) / 1024 note = "" if dpi == 131: note = "(Polovina originálu)" if dpi == 262: note = "(Originální rozlišení)" print(f"{dpi:<5} | {t:<6} | {size_kb:<9.2f} KB | {note}") doc.close() print("-" * 80) if __name__ == "__main__": generate_final_matrix()