2010-05-25 6 views
5

Necesito preproducir un millón o dos archivos PDF desde una plantilla simple (algunas páginas y tablas) con fuentes incrustadas. Por lo general, me mantendría en un nivel bajo en un caso como este, y redactaría todo con una biblioteca como ReportLab, pero me incorporé tarde en el proyecto.¿Forma confiable y rápida de convertir un trillón de archivos ODT en PDF?

Actualmente, tengo un template.odt y uso marcadores en los archivos content.xml para completar los datos de un DB. Puedo crear sin problemas los archivos ODT, siempre se ven bien.

Para la conversión de ODT a PDF, estoy usando openoffice en modo servidor (y PyODConverter con canalización con nombre), pero no es muy confiable: en un lote de documentos, finalmente hay un punto después del cual todos los procesados los archivos se convierten en basura (las fuentes y letras incorrectas se extienden por toda la página).

El problema no es predeciblemente reproducible (no depende de los datos), ocurre en OOo 2.3 y 3.2, en Ubuntu, XP, Server 2003 y Windows 7. Mi detector Heisenbug está en marcha.

Intenté reducir el tamaño de los lotes y reiniciar OOo después de cada uno; aún así, un pequeño porcentaje de los documentos están en mal estado.

Por supuesto que escribiré sobre esto en las listas de correo de Ooo, pero mientras tanto, tengo una entrega y ya he perdido demasiado tiempo.

¿A dónde voy?

  1. Evita por completo el formato ODT e id a otro sistema de plantillas.

    • Sugerencias? Cualquier cosa que tarde unos segundos en ejecutarse es demasiado lenta. OOo toma alrededor de un segundo y se resume en 15 días de tiempo de procesamiento. Tuve que escribir un programa para agrupar los trabajos en varios clientes.
  2. Guarde el formato pero busque otra herramienta/programa para la conversión.

    • ¿Cuál? Hay muchas aplicaciones en el shareware o repositorios comerciales para Windows, pero probar cada una es una tarea desalentadora. Algunos son demasiado lentos, algunos no se pueden ejecutar por lotes sin comprarlos primero, algunos no pueden funcionar desde la línea de comandos, etc.
    • Las herramientas de código abierto tienden a no reinventar la rueda ya menudo dependen de openoffice.
  3. Convertir a un formato .DOC intermedio podría ayudar a evitar el error OOo, pero duplicaría el tiempo de procesamiento y complicaría una tarea que ya es demasiado peluda.

  4. Intente generar los archivos PDF dos veces y compararlos, descartando todo el lote si hay algún problema.

    • Aunque los documentos se ven iguales, no conozco ninguna forma de comparar el contenido binario.
  5. Reinicia OOo después de procesar cada documento.

    • que tomaría mucho más tiempo para producirlos
    • bajaría el porcentaje de los archivos equivocados, y que sea muy difícil su identificación.
  6. Vaya a ReportLab y recree las páginas mediante programación. Este es el enfoque que voy a intentar en unos minutos.

  7. Aprende a formatear correctamente las listas con viñetas

muchas gracias.

Editar: parece que no puedo usar ReportLab en absoluto, no me deja incrustar la fuente. Mi fuente viene en versiones TrueType y OpenType.

El TrueType uno dice "TTFError: La fuente no permite subconjuntos/incrustación (0100)".

La versión de OpenType dice "No se admiten los [...] contornos de PostScript TTFError".

Muy muy divertido.

+0

¿Hay alguna manera de detectar de manera confiable la corrupción en los archivos PDF resultantes? ¿Algún tipo de firma que todos contienen? Podría ser la solución más fácil a corto plazo para reiniciar OOo y volver a generar el documento actual cuando se produce un archivo PDF dañado. –

+0

No pude encontrar la manera. El tamaño del archivo es similar, a veces las letras se extienden por la página, a veces se usan las fuentes incorrectas y, a veces, la fuente es la correcta pero se muestra en negrita. –

Respuesta

2

Probablemente terminaré encontrando alguna manera de determinar cuándo el proceso por lotes se vuelve loco, y luego reprocesar todo desde poco antes de que fallara. ¿Cómo determinar cuándo se vuelve loco? Que requerirá el análisis de algunos archivos PDF correctas y algunas fallidas, a buscar similitudes entre ellos:

  • archivos generados no son del tamaño correcto en comparación con su fuente
  • los archivos no contienen alguna cadena (como el nombre de su fuente)
  • algunos bits de datos no está en el lugar esperado
  • cuando se convierte de nuevo a texto, que no contienen datos que se esperan de la plantilla
  • cuando se convierte en un mapa de bits, texto ISN' t en el lugar correcto

Sospecho que volver a convertirlos en texto y buscar las cadenas esperadas va a ser la solución más precisa, pero también lenta. Si es demasiado lento para ejecutar en cada archivo, ejecútelo cada 1/100avo más o menos, y simplemente reconvierta cada archivo después del último conocido.

+0

No con un simple grep. La única forma en que puedo pensar para detectar algunos de ellos es convertir a un formato de trama y ver si está escrito sobre los márgenes de la página. Hairy ... –

+0

Creo que la conversión a un mapa de bits y la búsqueda de basura en los márgenes funcionaría bien. Si es lento, solo revisa cada centésima o milésima. Si necesita ayuda para descubrir cómo hacerlo, solo haga otra publicación. Uso ImageMagick para este tipo de cosas todo el tiempo, así que no es demasiado difícil. – Gabe

+0

Sí, estoy investigando si "convert-trim" transmitido a través de/usr/bin/file funciona lo suficientemente bien, entonces voy a post-procesar cada lote en el servidor para rechazar los malos en la recepción. El ancho de la primera página es casi constante para los buenos. –

0

Para su caso, parece que Reportlab PLUS es una buena opción, que incluye plantillas y soporte telefónico para que funcione rápidamente.

+0

La versión comercial de reportlab cuesta varios miles de libras en arrendamiento, cada año, dependiendo de la cantidad de páginas generadas (!) Y tiene un precio diferente para el sector financiero. No tengo ese presupuesto en este momento. Cuando lo tenga en ejecución, lo evaluaré. –

0

Muy interesante problema. Dado que ya lo ha escrito para agrupar en varias máquinas, ¿por qué no utilizar el enfoque de producción doble y extenderlo en los nodos EC2? Te costará un poco más, pero puedes comparar cosas usando hash md5 o sha y si dos versiones son iguales, puedes seguir adelante.

+0

no, la conversión del mismo archivo dos veces produce dos binarios muy diferentes. –

+0

¿Entonces el proceso de conversión no es determinista? Eso es extraño. ¿Cómo es el contenido diferente? diff puede comparar binario; también puedes probar esto http://www.melaneum.com/blog/linux/pdf-diff – whatnick

+0

Oh, difieren, como este http://imagebin.ca/view/GcLtXR.html –

0

Para comparar 2 archivos pdf recomendaría i-net PDF content comparer. Puede comparar 2 directorios de archivos PDF muy buenos. Lo usamos en nuestro sistema de prueba de regresión.

3

Para crear una cantidad tan grande de archivos PDF, OpenOffice me parece el producto equivocado. Debe usar una solución de informes real que esté optimizada para crear una gran cantidad de archivos PDF. Hay muchas herramientas diferentes.Recomendaría i-net Clear Reports (solía llamarse i-net Crystal-Clear).

  • Espero que un archivo PDF se cree más rápido que con OpenOfice.
  • Crear 2 archivos PDF y compararlos costará mucha velocidad.
  • Puede incorporar fuentes True Type.
  • Con la API puede trabajar en un bucle.
  • Con una licencia de prueba se puede trabajar durante 90 días en su lote

Las desventajas es que debe reiniciar su desarrollo.

+0

Ya estoy planeando reescribir todo, lo evaluaré. Pero aunque no soy un fanático de la fuente abierta, el precio depende de la cantidad de CPU que definitivamente es un desvío :-) –

Cuestiones relacionadas