2010-01-14 43 views
14

Estoy buscando la mejor herramienta precisa para PDF en Python que funciona como Jinja para HTML.Jinja-like for Pdf en Python

¿Cuáles son sus sugerencias?

+0

Si está familiarizado con el marco Jinja me acaba de agregar una respuesta le puede resultar útil. – Matteo

Respuesta

11

Según la respuesta de jbochi, ReportLab es la base de casi todos los proyectos de Python que generan PDF.

Pero para sus necesidades es posible que desee comprobar Pisa/xhtml2pdf. Usted generaría su HTML con una plantilla de Jinja y luego usaría Pisa para convertir el HTML a PDF. Pisa está construido sobre ReportLab.

Editar: otra opción me había olvidado es wkhtmltopdf

4

Eche un vistazo a ReportLab Toolkit.

Sin embargo, puede utilizar plantillas solo con la versión comercial.

+0

Tiene razón y es un problema ya que me gustaría trabajar desde una plantilla en formato pdf. – Mamane

+1

Quizás sea una exageración, pero podría usar Jinja para generar el texto y el conjunto de herramientas para convertir el texto a PDF. – jbochi

+0

@jbochi: No exagerado, IMO. Creo que esta solución funciona muy bien. –

1

¿Qué pasa con python/jinja a rst/html y html/rst a pdf utilizando rst2pdf o pandoc.

Ambos me han funcionado bien pero. como plaes, puedo probar Weasyprint en el futuro.

3

Tenía exactamente el mismo requisito que el OP. Lamentablemente, WeasyPrint no era una solución viable, porque necesitaba un posicionamiento muy preciso y compatibilidad con códigos de barras. Después de unos días de trabajo, terminé un contenedor XML de reportlab con soporte Jinja2.

El código se puede encontrar en GitHub incluyendo un ejemplo XML que genera el siguiente PDF.

0

Si desea utilizar un PDF existente como plantilla, sin alterar el documento original, puede usar el editor de plantillas Dhek, que permite definir el área (límites, nombre, tipo) en un archivo de plantilla separado.

La plantilla se guarda en formato JSON para que se pueda analizar en Python, rellenar áreas en PDF y generar el documento final (por ejemplo, con valores del formulario web).

Consulte la documentación en https://github.com/applicius/dhek.

0

¿Qué herramienta más precisa para PDF en Python que funciona como Jinja que Jinja?

Solo tiene que asegurarse de que las cadenas de identificación de bloque, variable y comentario Jinja no entren en conflicto con los comandos LaTeX. Una vez que cambie el entorno Jinja para imitar el entorno LaTeX, ¡ya está listo!

He aquí un fragmento que funciona fuera de la caja:

Fuente Python: Plantilla./create_pdf.py

import os, jinja2 
from jinja2 import Template 

latex_jinja_env = jinja2.Environment(
    block_start_string = '\BLOCK{', 
    block_end_string  = '}', 
    variable_start_string = '\VAR{', 
    variable_end_string = '}', 
    comment_start_string = '\#{', 
    comment_end_string = '}', 
    line_statement_prefix = '%%', 
    line_comment_prefix = '%#', 
    trim_blocks   = True, 
    autoescape   = False, 
    loader    = jinja2.FileSystemLoader(os.path.abspath('./latex/')) 
) 
template = latex_jinja_env.get_template('latex_template.tex') 

# populate a dictionary with the variables of interest 
template_vars = {} 
template_vars['section_1'] = 'The Section 1 Title' 
template_vars['section_2'] = 'The Section 2 Title' 

# create a file and save the latex 
output_file = open('./generated_latex.tex', 'w') 
# pass the dictionary with variable names to the renderer 
output_file.write(template.render(template_vars)) 
output_file.close() 

Látex:./latex/latex_template.tex

\documentclass{article} 
\begin{document} 
\section{Example} 
An example document using \LaTeX, Python, and Jinja. 

% This is a regular LaTeX comment 
\section{\VAR{section_1}} 
\begin{itemize} 
\BLOCK{ for x in range(0,3) } 
    \item Counting: \VAR{x} 
\BLOCK{ endfor } 
\end{itemize} 

\#{This is a long-form Jinja comment} 
\BLOCK{ if subsection_1_1 } 
\subsection{ The subsection } 
This appears only if subsection_1_1 variable is passed to renderer. 
\BLOCK{ endif } 

%# This is a short-form Jinja comment 
\section{\VAR{section_2}} 
\begin{itemize} 
%% for x in range(0,3) 
    \item Counting: \VAR{x} 
%% endfor 
\end{itemize} 

\end{document} 

Ahora sólo tiene que llamar: $> python ./create_pdf.py

resultante de látex Fuente:./generated_latex.tex

\documentclass{article} 
\begin{document} 
\section{Example} 
An example document using \LaTeX, Python, and Jinja. 

% This is a regular LaTeX comment 
\section{The Section 1 Title} 
\begin{itemize} 
    \item Counting: 0 
    \item Counting: 1 
    \item Counting: 2 
\end{itemize} 

\section{The Section 2 Title} 
\begin{itemize} 
    \item Counting: 0 
    \item Counting: 1 
    \item Counting: 2 
\end{itemize} 

\end{document} 

PDF generado:

enter image description here

Referencias: