-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcompressPdf_cli.py
More file actions
79 lines (72 loc) · 2.74 KB
/
Copy pathcompressPdf_cli.py
File metadata and controls
79 lines (72 loc) · 2.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# -*- coding: utf-8 -*-
# ## ########################################################################
#
# Author: Wilbert Miguel Nahuatlato — Ingeniero Mecatrónico
# License: MIT
#
# ========================================================
# kompressPdf — CLI v1.0 (versión original de consola)
# ========================================================
#
# Script original de compresión de PDF sin interfaz gráfica.
# Convierte cada página a imagen JPEG y reconstruye el PDF.
#
# Uso:
# 1. Edita las variables `nombre_pdf`, `escala` y `calidad` abajo.
# 2. Ejecuta: python compressPdf_cli.py
#
# Dependencias:
# pip install pypdfium2 Pillow img2pdf
#
# Ver kompressPdf.py para la versión completa con GUI y control
# de rendimiento para PDFs grandes (1000+ páginas, 1–3 GB).
# ========================================================
# ## ########################################################################
import pypdfium2 as pdfium
from pathlib import Path
from PIL import Image
import img2pdf
import os
nombre_pdf = "Linear algebra with applications - students solutions -- Gareth Williams; prepared by Wanda J. Mourant -- ( WeLib.org ).pdf"
nombre_pdf_comprimido = "Linear algebra with applications - students solutions -- Gareth Williams; prepared by Wanda J. Mourant -- ( WeLib.org )_comprimido.pdf"
nombre_pdf_sin_extension = Path(nombre_pdf).stem
escala = 2 # Escala para convertir PDF a imagen
"""
Extraer cada página del PDF como imagen
"""
pdf = pdfium.PdfDocument(nombre_pdf)
cantidad_paginas = len(pdf)
imagenes = []
for indice_pagina in range(cantidad_paginas):
numero_pagina = indice_pagina+1
nombre_imagen = f"{nombre_pdf_sin_extension}_{numero_pagina}.jpg"
imagenes.append(nombre_imagen)
print(f"Extrayendo página {numero_pagina} de {cantidad_paginas}")
pagina = pdf.get_page(indice_pagina)
imagen_para_pil = pagina.render(scale=escala).to_pil()
imagen_para_pil.save(nombre_imagen)
imagenes_comprimidas = []
"""
Comprimir imágenes.
Entre menor calidad, menos peso del PDF resultante
"""
calidad = 70
for nombre_imagen in imagenes:
print(f"Comprimiendo {nombre_imagen}...")
nombre_imagen_sin_extension = Path(nombre_imagen).stem
nombre_imagen_salida = nombre_imagen_sin_extension + \
"_comprimida" + nombre_imagen[nombre_imagen.rfind("."):]
imagen = Image.open(nombre_imagen)
imagen.save(nombre_imagen_salida, optimize=True, quality=calidad)
imagenes_comprimidas.append(nombre_imagen_salida)
"""
Escribir imágenes en un nuevo PDF
"""
print("Creando PDF comprimido...")
with open(nombre_pdf_comprimido, "wb") as documento:
documento.write(img2pdf.convert(imagenes_comprimidas))
"""
Eliminar imágenes temporales
"""
for imagen in imagenes + imagenes_comprimidas:
os.remove(imagen)