- PDFSyntax es una biblioteca de Python enfocada en el capítulo 7, “Syntax”, de la especificación PDF, usada para inspeccionar y transformar la estructura interna de documentos PDF hasta el nivel de bytes
- Está escrita desde cero en Python puro y es una biblioteca ligera sin dependencias, con énfasis en la simplicidad y la inmutabilidad
- Su método de edición predeterminado es la actualización incremental no destructiva permitida por la especificación PDF, que agrega una sección de cambios al final del archivo original, con posibilidad de revertir revisiones o consolidarlas en una sola
- La CLI ofrece
overview, disasm, text, fonts, browse, entre otros; browse genera una HTML estática con hipervínculos para explorar la estructura interna y mostrar el código fuente del PDF de forma legible
- Actualmente es un proyecto beta en desarrollo, por lo que la API puede cambiar en cualquier momento; tiene licencia MIT, pero todavía no acepta contribuciones externas
Inspección y transformación de la estructura interna de PDF
- PDFSyntax es una biblioteca de Python para inspeccionar y transformar la estructura interna de archivos PDF
- Se enfoca en el capítulo 7 de la especificación Portable Document Format (PDF): “Syntax”
- Implementa la gestión de la estructura del documento hasta el nivel de bytes para usos como:
- acceso a metadatos
- rotación de páginas
- operaciones de lectura/escritura de PDF
- acceso y manipulación de objetos internos
Enfoque de diseño
- Las funciones internas se exponen como un toolkit de API para operaciones de lectura/escritura de PDF
- Algunas funciones también se ofrecen como CLI para usarse desde la terminal o el navegador
- La biblioteca está escrita en Python puro y no tiene dependencias externas
- Prioriza la simplicidad y la inmutabilidad
- Su método de edición predeterminado es la actualización incremental: en lugar de sobrescribir directamente el original, agrega los cambios al final del archivo
- Si hace falta, se pueden revertir revisiones
- También se pueden consolidar todas las revisiones en una sola
Instalación y uso de la CLI
- Se puede instalar desde PyPI
pip install pdfsyntax
- El formato básico de uso de la CLI es el siguiente
pdfsyntax COMMAND FILE
- Si se instala desde el código fuente, puede ejecutarse con una forma más larga
python3 -m pdfsyntax COMMAND FILE
- Los principales comandos para análisis rápido de PDF son:
overview: muestra información en texto sobre la estructura y los metadatos
disasm: imprime un volcado de la estructura del archivo en la terminal
text: muestra el texto extraído manteniendo la disposición espacial, como en un escaneo
fonts: muestra la lista de fuentes utilizadas
browse: presenta el código fuente del PDF de forma legible y genera una HTML estática con hipervínculos para facilitar la exploración de la estructura interna
Forma de uso de la API
- PDFSyntax está compuesto en su mayoría por funciones simples
- Con
readfile se puede leer un PDF y con metadata obtener sus metadatos en forma de dict de Python
>>> from pdfsyntax import readfile, metadata
>>> doc = readfile("samples/simple_text_string.pdf")
>>> metadata(doc)
- El objeto
Doc es prácticamente la única clase dedicada que almacena el estado interno del documento
- contenido almacenado en caché o memoizado desde el archivo original
- cambios de adición, modificación o eliminación de contenido
- historial de modificaciones rastreado mediante actualizaciones incrementales
- La misma función
metadata también puede usarse como método del objeto Doc
>>> doc.metadata()
- Con funciones de bajo nivel como
get_object y update_object se puede acceder y manipular directamente los objetos internos del documento
- También ofrece funciones de alto nivel como
rotate
>>> from pdfsyntax import rotate, writefile
>>> doc180 = rotate(doc, 180)
- En el ejemplo de rotación, el objeto original no se modifica; se crea un nuevo objeto con el cambio de orientación en curso
- El PDF modificado puede escribirse en disco con
writefile
>>> writefile(doc180, "rotated_doc.pdf")
- El archivo resultante queda con una nueva sección agregada después del contenido original, y al recortarla se pueden deshacer los cambios
Estado actual y política de contribuciones
- El proyecto está en desarrollo y es software de calidad beta
- La API puede cambiar en cualquier momento
- La lista de próximas tareas incluye:
- recorte y unión de páginas
- compresión sin pérdidas
- más filtros
- mejoras en la extracción de texto
- refuerzo de la extracción de texto mediante detección de layout
- PDFSyntax tiene licencia MIT
- Por ahora no acepta contribuciones externas
- es un proyecto personal y el tiempo es limitado
- primero se enfocará en nuevas funciones y en la hoja de ruta de refactorización; cuando se estabilice, aceptará contribuciones
1 comentarios
Opiniones de Hacker News
Hace mucho me tocó extraer datos de varios PDF, y creé una herramienta para visualizar la ubicación de los caracteres en la página y los cuadros delimitadores de todos los elementos.
Al final, el proyecto fracasó por completo y varias personas se enojaron porque no produjo los resultados esperados.
Hoy habría ido 100% por aprovechar las capacidades de los LLM para extraer datos de PDF. En ese momento no existía esa opción.
Según las expectativas, se puede llegar bastante lejos con OCR, pero en mi experiencia siempre se queda justo por debajo de lo necesario.
He visto varias veces casos en los que las letras del texto están hechas con glifos de fuentes personalizadas sin un mapeo tipo ASCII, o en los que las formas de las letras se dibujan con líneas, algo especialmente común en salidas de CAD.
Entonces no hay texto identificable que extraer, y al final hay que volver a revisar la página con OCR.
En https://runtrellis.com/ estamos construyendo desde cero un pipeline de procesamiento de PDF basado en LLM y modelos de lenguaje visual, y hemos visto una precisión de casi 100% incluso con PDF complicados.
La clave es usar motores basados en reglas junto con datos de referencia para validar los resultados de forma cruzada.
Bastante genial. Si esto hubiera existido en mi trabajo anterior, creo que lo habría usado mucho.
Idealmente, sería como https://lapo.it/asn1js/: sueltas un archivo y todo el procesamiento se hace localmente.
Gracias al “privilegio” de trabajar con código que extrae datos de PDF, durante un tiempo he usado la versión gratuita de iText RUPS para depurar PDF.
La inspección interna de esto parece más potente, así que suena muy bien. Pienso probarlo.
Recuerdo que había un proyecto similar en GitHub. Permitía visualizar datos binarios arbitrarios con un esquema dado, y creo que tenía un ejemplo de TCP/IP.
Se veía muy bueno para ese propósito, pero en mi último proyecto también necesitaba serialización, así que no lo usé.
https://github.com/HexFiend/HexFiend/blob/master/templates/T...
Curiosamente, cuando pruebo esos descriptores de formatos de archivo, uso PDF como “Hello World”, porque la especificación de PDF es bastante extraña.
Si el lenguaje de descripción puede expresar correctamente el layout de un PDF, sin duda se puede considerar bien diseñado.
Hasta ahora no he tenido mucha suerte salvo con herramientas que permiten salir del modo declarativo y decir “luego ejecuta este código”.
Esto también sería útil para forense y para encontrar marcas de agua.
Se ve bien.
Sería aún mejor si mostrara todos los bytes del PDF. Parece que
endobjyxrefno se ven.Sería realmente genial que esto saliera como biblioteca para el navegador. Bastaría con arrastrar y soltar un archivo para ver su interior. Aun así, es impresionante.
Bien hecho. Es una herramienta de vista previa de seguridad muy útil. Los PDF son un dolor de cabeza.
Me pregunto si la herramienta de UI encargada de la visualización es una biblioteca.
Me gusta mucho el formato de la UI, y también me gustaría usarlo para descomponer y depurar streams de bytes de video.
Edit: en realidad es bastante simple. ¡Buen uso de CSS! https://github.com/desgeeko/pdfsyntax/blob/main/docs/simple_...
En una línea parecida, ¿por qué el PDF todavía no ha sido reemplazado? Existen XPS, DjVu, XHTML (EPUB), pero todos parecen apuntar a casos de uso distintos, como archivos HTML empaquetados.
Lo que quiero es un formato de documento simple que permita incrustar otros archivos y metadatos sin la pesadez de Adobe.
Debería permitir hipervínculos dentro de la página, que el texto no se desborde al cambiar el tamaño de letra, y poder imprimirse de forma consistente.
PDF no es un formato de datos, sino un formato de descripción de páginas, y todas sus decisiones vienen de la necesidad de poder imprimir la misma “página” aunque se usen distintos sistemas operativos, software, impresoras y tamaños exactos de papel.
La razón principal por la que PDF ha durado tanto probablemente sea que muchas cosas funcionan sobre el paradigma del documento, es decir, ver un “documento” como un “conjunto de varias hojas de papel”.
Desde resúmenes posteriores a una consulta médica hasta documentos de registro de vehículos, ya tienen una representación visual específica elegida para verse bien y encajar con precisión en papel.
HTML, por ejemplo un formato autocontenido con imágenes y CSS en data URLs, o ePub, podría ser mejor en la mayoría de los aspectos.
Pero el objetivo es tan distinto que, si hoy intentas convencer de esa transición a quienes crean PDF, te dirán que el contenido se ve ligeramente distinto según el dispositivo y que hasta los saltos de página cambian según la configuración.
Algo interesante relacionado con esto es que incluso Google Docs, aunque probablemente bastante menos de la mitad de sus documentos se impriman o se conviertan a PDF, usa por defecto el modo con páginas y no el modo “sin páginas”.
El modo “sin páginas” es mucho más útil: se ajusta a la ventana como una página web normal y se desplaza infinitamente sobre una sola superficie continua.
El requisito de que “el texto no se desborde” trae muchos detalles.
En PDF, cada letra, carácter o glifo del texto puede tener una posición x,y exacta en la página, a veces incluso fuera de ella.
Por eso se puede colocar con precisión el contenido sin importar qué haya alrededor. La aplicación que usa PDF debe ubicar correctamente los elementos e implementar los saltos de línea por letras o palabras.
XPS fue lo más cercano a reimplementar PDF, pero Microsoft no consiguió suficiente apoyo de otros actores y desapareció discretamente.
PostScript es peculiar, pero es un lenguaje de programación completo; PDF no lo es. Es decir, no es Turing-completo.
PDF no soporta flujo de control, así que algo que en PostScript podría expresarse con un bucle simple, en PDF debe expandirse y guardarse como una serie de declaraciones o expresiones simples.
La ventaja es que para renderizar un PDF no se necesita un intérprete de programas completo.