This commit is contained in:
2025-12-29 15:46:03 +01:00
parent ea540cf370
commit 9baf342e1e
11 changed files with 845 additions and 1 deletions

View File

@@ -0,0 +1,66 @@
import fitz # PyMuPDF
import os
def compress_and_grayscale_pdf(input_path, quality=60, dpi=150):
"""
input_path: Cesta k souboru
quality: Kvalita JPG komprese (1-100). 60 je dobrý kompromis pro čitelnost a velikost.
dpi: Rozlišení. 150 DPI stačí pro čtení na monitoru/běžný tisk. Pro menší velikost zkuste 96 nebo 72.
"""
# Kontrola existence souboru
if not os.path.exists(input_path):
print(f"Chyba: Soubor nebyl nalezen: {input_path}")
return
try:
# Otevření zdrojového PDF
doc = fitz.open(input_path)
new_doc = fitz.open() # Vytvoření nového prázdného PDF
print(f"Zpracovávám: {os.path.basename(input_path)}")
print(f"Původní velikost: {os.path.getsize(input_path) / 1024:.2f} KB")
for page_num, page in enumerate(doc):
# Nastavení matice pro změnu rozlišení (DPI)
# Standardní PDF má 72 DPI. Zoom = požadované DPI / 72
zoom = dpi / 72
matrix = fitz.Matrix(zoom, zoom)
# 1. Renderování stránky do obrázku (Pixmap)
# colorspace=fitz.csGRAY zajistí převod do černobílé (Grayscale)
pix = page.get_pixmap(matrix=matrix, colorspace=fitz.csGRAY)
# 2. Vytvoření nové stránky v cílovém dokumentu se stejnými rozměry
# Používáme původní rozměry stránky (rect), aby se PDF "nezmenšilo" vizuálně na monitoru
new_page = new_doc.new_page(width=page.rect.width, height=page.rect.height)
# 3. Vložení zmenšeného a odbarveného obrázku zpět
# stream=pix.tobytes("jpg") zajistí silnou kompresi
new_page.insert_image(page.rect, stream=pix.tobytes("jpg", jpg_quality=quality))
# Vytvoření názvu výstupního souboru
output_path = input_path.replace(".pdf", "_bw_small.pdf")
# Uložení s garbage collection (odstranění nepotřebných dat) a deflací
new_doc.save(output_path, garbage=4, deflate=True)
new_doc.close()
doc.close()
# Výpis výsledku
new_size = os.path.getsize(output_path)
print(f"Hotovo. Uloženo jako: {output_path}")
print(f"Nová velikost: {new_size / 1024:.2f} KB")
except Exception as e:
print(f"Došlo k chybě: {e}")
# --- SPUŠTĚNÍ ---
# Použití raw stringu (r''), aby Python neinterpretoval zpětná lomítka jako escape znaky
file_path = r'u:\Dropbox\Ordinace\Dokumentace_ke_zpracování\AdobeMakeSmaller\90df6f84-72c8-40b8-8993-ce7e244b0cea.pdf'
# Můžete experimentovat s parametry.
# Pokud bude text nečitelný, zvyšte dpi na 200. Pokud je soubor moc velký, snižte quality na 40.
compress_and_grayscale_pdf(file_path, quality=50, dpi=120)