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,95 @@
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()