2011-05-27 34 views
6

Estoy usando pyPdf para combinar varios archivos PDF en uno. Esto funciona muy bien, pero también necesitaría agregar una tabla de contenidos/contornos/marcadores al archivo PDF que se genera.Crear esquemas/TOC para PDF existente en Python

pyPdf parece que solo ha leído la compatibilidad con los contornos. Reportlab me permitiría crearlos, pero la versión de código abierto no es compatible con la carga de archivos PDF, por lo que no funciona para agregar esquemas a un archivo existente.

¿Hay alguna forma en que pueda agregar esquemas a un PDF existente usando Python, o cualquier biblioteca que permita eso?

+0

De la parte superior de mi cabeza, pienso que hay por lo menos soluciones no-Python a esto para que usted puede crear su PDF y luego ejecutar un comando con algunas opciones para especificar lo que quiere para el contorno. No es genial, pero al menos debería permitirle hacer el trabajo. –

+1

Esto puede funcionar o no, intente con [link] (http://www.florian-diesch.de/software/pdfrecycle/) declaraciones de pdfrecycle para respaldar la generación de índices y marcadores. – secumind

Respuesta

2

Tuvimos un problema similar en WeasyPrint: cairo produce los archivos PDF pero no admite marcadores/contornos o hipervínculos. Al final mordimos la bala, leemos el PDF spec, y lo hicimos nosotros mismos.

WeasyPrint pdf.py tiene un analizador y escritor de PDF simple que puede agregar/anular PDF "objetos" a los documentos existentes. Utiliza el mecanismo de "actualización" de PDF y solo se agrega al final del archivo.

Este módulo se hizo para uso interno solamente pero estoy abierto a la refactorización para que sea más fácil de usar en otros proyectos.

Sin embargo, el analizador toma algunos atajos y no puede analizar todos los archivos PDF válidos. Puede ser necesario adaptarlo si la salida de PyPDF no es tan buena como la de Cairo. De cadena de documentación del módulo:

En lugar de intentar analizar cualquier archivo PDF válido, hacemos algunas suposiciones que sujetan a El Cairo con el fin de simplificar el código:

  • Todos los saltos de línea son '\ n', not '\ r' or '\ r \ n'
  • Con excepción del número 0 (que siempre es gratuito), no hay ningún objeto "libre".
  • La mayoría de los separadores de espacios en blanco están formados por un único espacio de 0x20.
  • Los objetos de diccionario indirectos no contienen '>>' al comienzo de una línea, excepto para marcar el final del objeto, seguido de 'endobj'. (En otras palabras, los marcadores '>>' para los diccionarios secundarios están sangrados.)
  • El Árbol de páginas es plano: todos los elementos secundarios del nodo de página raíz son objetos de página, no de árbol de página.
Cuestiones relacionadas