z230
This commit is contained in:
95
MakeSmallerPDF/5 MakeSmaller.py
Normal file
95
MakeSmallerPDF/5 MakeSmaller.py
Normal 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()
|
||||
Reference in New Issue
Block a user