19

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

你有什么建议?

4

7 回答 7

13

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

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

编辑:我忘记的另一个选项是wkhtmltopdf

于 2010-01-14T17:16:59.973 回答
4

看看ReportLab 工具包

不过,您只能在商业版本中使用模板。

于 2010-01-14T14:59:41.893 回答
3

现在有一个名为WeasyPrint的新孩子。

于 2012-02-10T19:55:41.240 回答
3

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

该代码可以在 GitHub 上找到,包括生成以下PDF的示例XML

于 2012-07-18T15:22:51.193 回答
2

python/jinja 到 rst/html 和 html/rst 到 pdf 使用rst2pdfpandoc 怎么样

这两个对我来说都很好,但是。喜欢 plaes,我以后可能会尝试Weasyprint

于 2012-05-18T18:15:10.633 回答
1

有什么比 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:

在此处输入图像描述

参考:

于 2017-06-19T23:55:58.087 回答
0

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

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

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

于 2014-07-17T11:37:40.067 回答