2 puntos por GN⁺ 2025-02-11 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2025-02-11
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.

    • Parsear datos desde PDF arbitrarios es casi una misión maldita. Como los PDF pueden contener imágenes, es parecido a apuntar directamente a JPEG.
      Según las expectativas, se puede llegar bastante lejos con OCR, pero en mi experiencia siempre se queda justo por debajo de lo necesario.
    • Los LLM pueden ayudar a ordenar correctamente los caracteres extraídos de una página, pero obtener el contenido real sigue siendo difícil.
      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 un trabajo anterior pasé por algo parecido: los enfoques de parsing basado en reglas son realmente difíciles de hacer bien y suelen fallar en casos límite.
      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.
    • Hace mucho trabajé extrayendo planos CAD 2D de PDF y convirtiéndolos a 3D completo; fue bastante divertido.
    • pdfjs hace todo eso y es bastante robusto. Lo usé recientemente para extraer datos tabulares de 10 años de estados de cuenta bancarios.
  • 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.

    • ¿Quizá https://kaitai.io/?
      Se veía muy bueno para ese propósito, pero en mi último proyecto también necesitaba serialización, así que no lo usé.
    • HexFiend también tiene una sintaxis de plantillas para visualizar datos binarios. Está basada en Tcl.
      https://github.com/HexFiend/HexFiend/blob/master/templates/T...
    • En este contexto hay que tener cuidado con la palabra “arbitrarios”.
      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.

    • Suena interesante. No sé mucho del tema: ¿cómo se podría usar esto para detectar marcas de agua? ¿Se podrían detectar firmas de la misma manera?
  • Se ve bien.
    Sería aún mejor si mostrara todos los bytes del PDF. Parece que endobj y xref no se ven.

    • Sí, lo corregiré pronto.
  • 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.

    • ¿Te refieres a una extensión del navegador? No quiero sonar grosero, solo quiero asegurarme de haber entendido bien.
  • 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_...

    • Sí. Valoro la simplicidad, y la interacción que ofrecen HTML y CSS básicos es suficiente para mi caso de uso :)
  • 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.

    • No creo que el hecho de que PDF sea un formato “desafortunado” para edición, lectura en dispositivos y extracción de información semántica en vez de información de presentación sea culpa de Adobe ni de su pesadez.
      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.
    • Son casos de uso distintos.
      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.
    • Algo interesante sobre PDF que no sabía hasta hace poco es que PDF es un subconjunto de PostScript, y eso explica parte de su peso.
      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.
    • En cuanto empieza una conversación así, aparece el bando de LaTeX, y todo el mundo que podría aportar algo significativo al estándar queda trabado en esa discusión.
    • Una razón es que ninguno de los otros formatos es apto tal cual para la impresión comercial.