2009-01-19 8 views
14

Estoy usando Python y Qt 4.4 y tengo que imprimir algunas páginas. Inicialmente pensé que usaría HTML con CSS para producir esas páginas. Pero HTML tiene algunas limitaciones.¿Hay un mejor lenguaje de diseño que HTML para imprimir?

Ahora la pregunta es: ¿hay algo que sea mejor que HTML pero que sea (o casi) tan fácil de usar? Además, debe ser compatible con GPL.

Editar:

kdgregory & Mark G: La limitación más obvia es que no puedo especificar los márgenes de la impresora. Hay otro problema: ¿cómo agrego los números de página?

Jeremy Francés: Una cosa que tengo que imprimir es una lista de todos los productos que alguien pidió que pueden extenderse en unas pocas páginas.

+1

Sería útil que enumerara las limitaciones que se interponen en su camino. Además de la posibilidad de que un experto en CSS pueda eliminarlos, el conocimiento evitaría que las personas brinden soluciones igualmente limitadas. – kdgregory

+0

¡Desearía que pudieras +1 comentarios, +1 @kdgregory! He utilizado un Templating Engine y HTML/CSS exitosamente numerosas veces para imprimir documentos. ¿Qué limitaciones estás golpeando que causó esta pregunta? –

+0

También puede ser útil si dijera la estructura de lo que desea imprimir. Si tiene cientos de páginas de documentos, hay diferentes respuestas si desea imprimir una página con un formato muy agradable.También puede ser útil si nos da una idea del formato fuente. –

Respuesta

24

he estado luchando con el impreso (o PDF) de salida de Python desde hace 8 años y hasta ahora me encontré con los siguientes criterios (en orden de preferencia personal):

  • Usando JasperReports través pyJasper (escrito por mí) o JasperServer. Puede usar la herramienta de diseño WYSIWYG iReport para definir su diseño. Su código Python se pondrá en contacto con el motor Jasper basado en Java a través de HTTP y lo convertirá en un PDF (pyJasper maneja eso). Usamos eso por unos pocos miles de páginas por día.
  • Utilice la salida de texto sin formato. No puedes obtener más rápido. Usamos eso por unos cientos de páginas por día.
  • Utilice XSLT-FO. También debe llamar a un motor de representación basado en Java como FOB. Puede dar lugar a problemas de rendimiento, pero puede mitigarse mediante un proceso de servidor Java de larga duración, el mismo enfoque que con Jasper. Usamos eso por unos cientos de páginas por día, pero escribir documentos XSLT-FO me hizo doler la cabeza. No se usa para el nuevo código.
  • Generar fuente LaTeX y utilizar un paquete de software de látex para procesar en PDF.Hacer que LaTeX se vea como me parece bastante difícil. Pero mientras use los estilos LaTeX provistos, estará bien. No se usa en producción en mi tienda.
  • generación de PDF con el ReportLab Toolkit. Un poco bajo nivel. Aún más bajo nivel: FPDF. Usamos FPDF-Ruby por unos cientos de páginas por día. Tomó mucho de fiddeling para obtener el diseño que queríamos.
  • Genera directamente Postscript. Extraño pero casi no se puede obtener más en términos de velocidad y control. Usamos eso para generar hojas de contactos con algunos cientos de miles de jpegs por día. Toma el violín pero es divertido.
  • use troff/groff para generar Postscript/PDF. Nivel muy bajo, agradable para hacer cosas simples de alto volumen. Nunca lo usé así en producción.

Para pedidos, facturas y similares Le recomiendo JasperReports. La capacidad de usar un editor visual para definir el diseño es un gran ahorro de tiempo.

+0

6 años después: sigue usando pyJasper en algunos servidores Amazon EC2 detrás de un equilibrador de carga. Aún feliz con eso. – max

14

There's LaTeX. No estoy seguro si eso cae en la categoría "tan fácil de usar como html", pero no es difícil.

+0

Y dudo que haya algo mejor para el diseño de impresión automático. –

+0

Creo que LaTeX no es compatible con la licencia GPL. –

+0

Me encanta LaTeX pero me resulta muy difícil generar algo con LaTex que no se parece a las cosas que Lamport & Co imaginó. También el soporte de LaTeX de cosas similares a la tabla es inferior a la media. – max

7

Por imprime ¿te refieres a una impresora? Si es así, verifique las herramientas de PDF de ReportLab.

from reportlab.pdfgen import canvas 
from reportlab.lib.units import cm 
c = canvas.Canvas("hello.pdf") 
c.drawString(9*cm, 22*cm, "Hello World!") 
c.showPage() 
c.save() 
+0

@nosklo - Suena más como un paso atrás, también podría usar System.Drawing y dibujar en una imagen e imprimir eso? A menos que se ocupe de la búsqueda, es decir, "¡Hola mundo!" en esa posición necesita envolverse. –

+2

ReportLabs también tiene un motor de diseño (Platypus) – oefe

+0

Me gusta ReportLab (con su motor de diseño) y he utilizado iText (generación de PDF para Java, similar a ReportLab) y XSL-FO. En mi opinión, después de pasar muchas horas intentando depurar hojas de estilo XSL-FO, XSL-FO significa 'objetos XML', eFfed '. ReportLab es mucho más fácil, más rápido y mucho más ligero. – joeforker

1

¿Qué hay de malo en usar sólo Qt's native printing?

+0

Me gustaría tener la plantilla de diseño por separado y no incluirla en el código fuente. –

+0

¿Seguro que quiere que los usuarios finales bloqueen su programa? –

+1

No, pero me resulta más fácil cambiar varias partes de una aplicación de esta manera. –

3

XSL Formatting Objects (parte de la The Extensible Stylesheet Language Family (XSL)) si necesita control total sobre documentos impresos.

Luego, necesitará un procesador de formato de objetos, como FOP o Antenna house, para transformar el documento XSL-FO en PDF o PostScript.

+0

No tiene control total ni nada que le pueda gustar razonablemente. Tal vez suficiente control. –

+0

Entonces no lo ha usado profesionalmente. Al igual que HTML, también requiere habilidad. – baretta

3

Puede considerar Sphinx, un paquete que traduce los archivos reStructuredText en varios formatos de salida, incluyendo HTML y LaTeX, para PDF imprimible. Está licenciado bajo BSD y ahora es la herramienta oficial de documentación de Python.

4

¿Has visto http://www.w3.org/TR/css3-page/? Los medios impresos son altamente personalizables. En mi nuevo proyecto, voy a reemplazar el generador de PDF por este.

+0

En teoría, esto funciona, pero no creo que haya un procesador de HTML + CSS3 que admita medios de impresión. –

1

Me gustó asciidoc. Básicamente, usted produce texto sin formato. Esto se puede mejorar mucho utilizando un sistema de plantillas como Django templates o Jinja2. Esto se parece mucho a la cosa XSLT-FO descrita por mdorseif (utiliza una cadena de herramientas para producir docbook y luego cualquier cosa que quiera), pero no tanto dolor de cabeza. Ya hay una bonita envoltura de cadena de herramientas que facilita la mayoría de las cosas.

1

JasperReports ya se ha mencionado, pero lo usamos en nuestras aplicaciones Python-Qt SIN un servidor o servlet (es decir, sin necesidad de JasperServer o pyJasper).

Básicamente, en lugar del servidor/servlet, instala el Jasper Reports Library. Luego debe crear un pequeño programa Java que use la Biblioteca de Informes Jasper para generar un informe PDF a partir de una entrada serializada, como XML. Debería haber muchos ejemplos de esto si realiza una búsqueda web, y solo necesita escribir esto una vez. Luego compila este programa Java, con todas las bibliotecas requeridas, en un archivo JAR.

En este punto puede instalar JasperSoft Studio y crear una plantilla de informe Jasper. Luego, en Python puede usar JPype (o cualquier otra biblioteca de Python a Java) para iniciar una JVM, cargar su archivo JAR, llamar a su función Java, pasar sus datos serializados y especificar qué plantilla de informe desea.

Todo esto no es trivial, pero es bastante sencillo. Nos gusta esta solución porque proporciona un editor de formulario de arrastrar y soltar en el Qt Designer/Creator, un diseñador de informes JasperReports de arrastrar y soltar y la capacidad de generar un informe en PDF directamente a partir de los datos recopilados en Python. Todo esto utiliza herramientas y bibliotecas bien respaldadas, por lo que es poco probable que esta solución se desmorone en un futuro previsible.

Cuestiones relacionadas