95 lines
3.1 KiB
Python
95 lines
3.1 KiB
Python
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() |