我正在为 Python 中的 PDF 寻找最准确的工具,就像 Jinja 对 HTML 所做的那样。
你有什么建议?
正如 jbochi 所回答的,ReportLab 是几乎所有生成 PDF 的 Python 项目的基础。
但根据您的需要,您可能需要查看Pisa / xhtml2pdf。您将使用 Jinja 模板生成 HTML,然后使用 Pisa 将 HTML 转换为 PDF。Pisa 建立在 ReportLab 之上。
编辑:我忘记的另一个选项是wkhtmltopdf
不过,您只能在商业版本中使用模板。
现在有一个名为WeasyPrint的新孩子。
python/jinja 到 rst/html 和 html/rst 到 pdf 使用rst2pdf或pandoc 怎么样。
这两个对我来说都很好,但是。喜欢 plaes,我以后可能会尝试Weasyprint。
有什么比 Jinja 本身更准确的 Python 中的 PDF 工具可以像 Jinja 一样工作?
您只需确保Jinja
块、变量和注释标识字符串不与LaTeX
命令冲突。一旦您更改Jinja
环境以模仿LaTeX
环境,您就可以开始了!
这是一个开箱即用的片段:
蟒蛇来源: ./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
产生的乳胶来源: ./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:
参考:
如果您想使用现有的 PDF 作为模板,而不更改原始文档,您可以使用 Dhek 模板编辑器,它允许在单独的模板文件中定义区域(边界、名称、类型)。
模板以 JSON 格式保存,以便可以在 Python 中进行解析,以填充 PDF 上的区域并生成最终文档(例如,使用来自 Web 表单的值)。