我正在寻找Python中最准确的PDF工具,就像Jinja对HTML一样。
你有什么建议?
答案 0 :(得分:12)
正如jbochi所回答,ReportLab是几乎所有生成PDF的Python项目的基础。
但是根据您的需要,您可能需要查看Pisa / xhtml2pdf。您将使用Jinja模板生成HTML,然后使用Pisa将HTML转换为PDF。比萨建立在ReportLab之上。
修改:我忘记的另一个选项是wkhtmltopdf
答案 1 :(得分:4)
但是,您只能将模板与商业版一起使用。
答案 2 :(得分:3)
现在这个名叫WeasyPrint的街区有一个新的孩子。
答案 3 :(得分:3)
我和OP的要求完全相同。不幸的是,WeasyPrint不是一个可行的解决方案,因为我需要非常精确的定位和条形码支持。经过几天的工作,我完成了一个带有Jinja2支持的reportlab XML包装器。
答案 4 :(得分:1)
使用rst2pdf或pandoc将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:
<强>参考文献:强>
答案 6 :(得分:0)
如果要将现有PDF用作模板而不更改原始文档,可以使用Dhek模板编辑器,该编辑器允许在单独的模板文件中定义区域(边界,名称,类型)。
模板以JSON格式保存,以便可以在Python中解析,填充PDF区域并生成最终文档(例如,使用Web表单中的值)。