105 lines
3.9 KiB
Python
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) |