Saltar al contenido principal
🇬🇧 English 🇧🇷 Português 🇩🇪 Deutsch
Convertidor de imágenes Convertidor de vídeo Convertidor de audio Convertidor de documentos
Herramientas Guías Formatos Precios API
Iniciar sesión
Guía

PDF con formularios: rellenar campos con Python y pypdf

PC Por Pablo Cirre

Conversiones relacionadas

Pon en práctica lo que acabas de aprender — convierte tus archivos ahora en segundos, gratis y sin registro.

Preguntas frecuentes

No, modificar un PDF firmado invalida la firma. Los formularios firmados están diseñados precisamente para que su contenido no pueda alterarse después de firmar — esa es la garantía criptográfica. Si necesitas un workflow donde se rellena Y se firma: rellena primero con pypdf, y solo después aplica la firma digital (con pyHanko o similar). Si recibes un PDF ya firmado y necesitas añadir información, solo puedes añadir anotaciones encima sin modificar el contenido firmado original — útil para revisión pero no para "rellenar" en sentido estricto.

El flag <code>/NeedAppearances</code> del documento controla si los lectores PDF deben regenerar la apariencia visual de los campos basándose en el valor almacenado. Si está en False (default en muchos templates), el PDF guarda el valor pero no genera el render visual, y lectores estrictos como Adobe lo muestran vacío. Solución: tras escribir, fuerza el flag con <code>writer._root_object["/AcroForm"][NameObject("/NeedAppearances")] = BooleanObject(True)</code>. Esto le pide al lector que regenere la apariencia al abrir.

Tres causas típicas: (1) el PDF es XFA (XML Forms Architecture) — solo Adobe los maneja completamente, conviértelo a AcroForm con LibreOffice o Adobe Acrobat ("Save as standard PDF"), (2) el PDF tiene los campos pero están en una capa "annotations" no "form fields" — usa <code>page["/Annots"]</code> directamente con pdfrw, (3) el PDF está protegido con contraseña — pasa la contraseña a PdfReader: <code>PdfReader("file.pdf", password="abc")</code>. Si nada funciona, el PDF puede ser realmente "fake form" — diseñado en Word con cajas dibujadas que parecen campos pero no lo son técnicamente.

pypdf — está activamente mantenida (releases mensuales), tiene mejor performance en PDFs grandes (3-5× más rápido en mis benchmarks con PDFs >50 páginas), API más limpia y documentación al día. pdfrw es útil como fallback cuando un PDF concreto le da problemas a pypdf (algunos PDFs producidos por software empresarial antiguo tienen estructura no-estándar que pdfrw maneja mejor). Patrón robusto: try pypdf, except → fallback a pdfrw → except → flag para revisión manual. Para batch a escala, paraleliza con multiprocessing.Pool sobre los PDFs (cada worker procesa uno completo) — pypdf no escala con threads (GIL).

pypdf no tiene flatten nativo en este momento. Pipeline en dos pasos: (1) rellena con pypdf, (2) aplana con pikepdf: <code>import pikepdf; pdf = pikepdf.open("filled.pdf"); pdf.flatten_annotations(); pdf.save("flat.pdf")</code>. Alternativa con CLI: <code>gs -dPreserveAnnots=false -sDEVICE=pdfwrite -sOutputFile=flat.pdf filled.pdf</code>. Resultado: un PDF visualmente idéntico pero donde los campos son ya "tinta sobre el papel" — no editables. Importante para distribución de contratos firmados o documentos legales finales.

Sí, con <code>pyHanko</code> — la librería más completa para firmas PDF en Python. Soporta certificados PKCS#11 (smartcards, eIDAS), certificados X.509 desde archivo, marca de tiempo (timestamping) y validación. <code>pip install pyhanko[pkcs11]</code> y luego: <code>from pyhanko.pdf_utils.incremental_writer import IncrementalPdfFileWriter; from pyhanko.sign import signers; signer = signers.SimpleSigner.load("cert.pfx", "passphrase"); ...</code>. Para firmas eIDAS conformes con regulación europea, pyHanko es la única opción Python madura. Aplica la firma DESPUÉS del rellenado — el orden es: rellenar → flatten → firmar.

Usamos cookies y tecnologías similares para personalizar contenido y anuncios, y para analizar el tráfico. Más información sobre cookies.