Jinja-como para Pdf em Python
-
20-09-2019 - |
Pergunta
Eu estou procurando a melhor ferramenta precisa para PDF em Python e que funciona como Jinja faz para HTML.
Quais são suas sugestões?
Solução
Conforme respondido por JBOCHI, o ReportLab é a base para quase todos os projetos do Python que geram PDF.
Mas para suas necessidades, você pode querer conferir PISA / XHTML2PDF. Você geraria seu HTML com um modelo Jinja e, em seguida, usaria o PISA para converter o HTML em PDF. O PISA é construído sobre o relatório.
Editar: Outra opção que eu esqueci é wkhtmltopdf
Outras dicas
Dê uma olhada em RelatórioLab Toolkit.
Você pode usar modelos apenas com a versão comercial.
Agora há um novo garoto no quarteirão chamado WEASYPRINT.
Eu tinha exatamente o mesmo requisito que o OP. Infelizmente, o WeasyPrint não era uma solução viável, porque eu precisava de posicionamento exato e suporte de código de barras. Depois de alguns dias de trabalho, terminei um wrapper do relatório XML com suporte ao Jinja2.
O código pode ser encontrado no github, incluindo um exemplo Xml que gera o seguinte Pdf.
E quanto a Python/Jinja para RST/HTML e HTML/RST para PDF usando qualquer um rst2pdf ou pandoc.
Ambos funcionaram bem para mim, mas. Como Plaes, posso tentar WEASYPRINT no futuro.
O que mais preciso ferramenta para PDF em Python e que funciona como Jinja de Jinja, em si?
Você apenas tem de se certificar de que o Jinja
bloco variável, e comentário de cadeias de caracteres de identificação não entrem em conflito com a LaTeX
comandos.Uma vez que você alterar o Jinja
ambiente para imitar o LaTeX
meio ambiente você está pronto para ir!
Aqui está um trecho de código que funciona fora da caixa:
Python Fonte: ./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 Modelo: ./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}
Agora basta chamar: $> python ./create_pdf.py
Resultante De Látex Fonte: ./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 Gerado:
Referências:
Se você deseja usar o PDF existente como modelo, sem alterar o documento original, você pode usar o DHEK Model Editor, que permite definir área (limites, nome, tipo) em um arquivo de modelo separado.
O modelo é salvo no formato JSON para que possa ser analisado no Python, para preencher áreas sobre PDF e gerar o documento final (por exemplo, com valores do formulário da Web).
Veja a documentação em https://github.com/applicius/dhek .