Jinja-like for Pdf in Python

时间:2010-01-14 14:56:05

标签: python pdf-generation jinja2

我正在寻找Python中最准确的PDF工具,就像Jinja对HTML一样。

你有什么建议?

7 个答案:

答案 0 :(得分:12)

正如jbochi所回答,ReportLab是几乎所有生成PDF的Python项目的基础。

但是根据您的需要,您可能需要查看Pisa / xhtml2pdf。您将使用Jinja模板生成HTML,然后使用Pisa将HTML转换为PDF。比萨建立在ReportLab之上。

修改:我忘记的另一个选项是wkhtmltopdf

答案 1 :(得分:4)

看看ReportLab Toolkit

但是,您只能将模板与商业版一起使用。

答案 2 :(得分:3)

现在这个名叫WeasyPrint的街区有一个新的孩子。

答案 3 :(得分:3)

我和OP的要求完全相同。不幸的是,WeasyPrint不是一个可行的解决方案,因为我需要非常精确的定位和条形码支持。经过几天的工作,我完成了一个带有Jinja2支持的reportlab XML包装器。

代码可以在GitHub上找到 包括一个示例XML,它会生成以下PDF

答案 4 :(得分:1)

使用rst2pdfpandoc将python / jinja改为rst / html和html / rst改为pdf怎么样?

这两个对我来说都很好。像plaes一样,我可能会在将来尝试Weasyprint

答案 5 :(得分:1)

Python中的PDF更准确的工具是Jinja而不是Jinja本身吗?

您只需确保Jinja块,变量和注释标识字符串不与LaTeX命令冲突。更改Jinja环境以模仿您已准备就绪的LaTeX环境后!

这是一个开箱即用的代码段:

Python来源: ./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()

乳胶模板: ./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}

现在只需致电:$> python ./create_pdf.py

产生的Latex来源: ./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:

enter image description here

<强>参考文献:

答案 6 :(得分:0)

如果要将现有PDF用作模板而不更改原始文档,可以使用Dhek模板编辑器,该编辑器允许在单独的模板文件中定义区域(边界,名称,类型)。

模板以JSON格式保存,以便可以在Python中解析,填充PDF区域并生成最终文档(例如,使用Web表单中的值)。

请参阅https://github.com/applicius/dhek上的文档。