Files
projects/MakeSmallerPDF/MakeSmallerPDF.py
2025-12-14 19:07:10 +01:00

105 lines
3.9 KiB
Python

from pdf2image import convert_from_path
from PIL import Image
import img2pdf
import os
import pathlib
import glob
# *** KONFIGURACE ***
# Cesta ke složce, kde se nacházejí PDF soubory
INPUT_DIR = r"u:\Dropbox\Ordinace\Dokumentace_ke_zpracování\AdobeMakeSmaller"
# Cesta k binární složce Poppleru (musí být správná, aby to fungovalo)
POPPLER_BIN_PATH = r'c:\poppler\library\bin'
# Rozlišení pro čitelnost (300 DPI by mělo být perfektní pro text)
TARGET_DPI = 200
# *******************
def create_min_bw_pdf(input_pdf_path, output_pdf_path, dpi):
"""
Konvertuje jeden PDF soubor na nový, maximálně zmenšený, černobílý PDF.
"""
temp_image_path = "temp_bw_image_for_batch.png"
success = False
print(f"\n--- Zpracovávám: {pathlib.Path(input_pdf_path).name} (DPI: {dpi}) ---")
try:
# 1. Převod PDF na obrázek (bitmapu)
# Používáme grayscale=True, ale hlavní komprese přijde v kroku 2
images = convert_from_path(
input_pdf_path,
dpi=dpi,
grayscale=True,
thread_count=1,
poppler_path=POPPLER_BIN_PATH
)
if not images:
print(f"⚠️ Chyba: Nepodařilo se konvertovat stránku z {input_pdf_path}.")
return success
# 2. Zpracování a převod na 1-bitový ČERNOBÍLÝ režim (maximální komprese barev)
image = images[0]
bw_image = image.convert('1')
# Uložení do dočasného PNG souboru (nejlepší pro 1-bitový obraz)
bw_image.save(temp_image_path, format='PNG', optimize=True)
# 3. Konverze dočasného obrázku zpět na PDF (přepisování originálu)
# Důležité: 'output_pdf_path' je stejné jako 'input_pdf_path'
with open(output_pdf_path, "wb") as f:
f.write(img2pdf.convert(temp_image_path))
# Zpráva o úspěchu a úspoře
original_size = os.path.getsize(input_pdf_path)
new_size = os.path.getsize(output_pdf_path)
reduction = (1 - new_size / original_size) * 100
print(
f"✅ Úspěch! Původní: {original_size / 1024:.2f} KB, Nový: {new_size / 1024:.2f} KB (Úspora: {reduction:.2f} %)")
success = True
except Exception as e:
print(f"❌ Nastala chyba při zpracování {input_pdf_path}: {e}")
print("Zkontrolujte, zda je Poppler cesta správná a máte práva k zápisu.")
finally:
# Vyčištění dočasného souboru
if os.path.exists(temp_image_path):
os.remove(temp_image_path)
return success
def process_directory(input_directory, dpi):
"""
Prochází zadaný adresář, hledá PDF a volá konverzní funkci.
"""
if not os.path.isdir(input_directory):
print(f"Chyba: Adresář nebyl nalezen na cestě: {input_directory}")
return
# Najdeme všechny soubory s příponou .pdf (ignorujeme velikost písmen)
pdf_files = glob.glob(os.path.join(input_directory, '*.pdf'), recursive=False)
if not pdf_files:
print(f"Ve složce {input_directory} nebyly nalezeny žádné PDF soubory.")
return
print(f"\nNalezeno {len(pdf_files)} souborů ke zpracování v {input_directory}.")
print("----------------------------------------------------------------------")
total_processed = 0
for file_path in pdf_files:
# Vstupní cesta je zároveň výstupní cestou (přepisování)
if create_min_bw_pdf(file_path, file_path, dpi):
total_processed += 1
print("----------------------------------------------------------------------")
print(f"Konec zpracování. Celkem úspěšně zpracováno: {total_processed}/{len(pdf_files)} souborů.")
# --- SPUSŤTE POUZE, AŽ BUDETE PŘIPRAVENI PŘEPSAT SOUBORY ---
print(f"!!! POUŽÍVÁ SE DPI: {TARGET_DPI}. ORIGINÁLNÍ SOUBORY BUDOU PŘEPSÁNY !!!")
process_directory(INPUT_DIR, TARGET_DPI)