Jinja-like для Pdf в Python
Я ищу лучший точный инструмент для PDF в Python, который работает как Jinja для HTML.
Каковы ваши предложения?
Ответы
Ответ 1
Как ответил jbochi, ReportLab является основой почти для всех проектов Python, которые генерируют PDF.
Но для ваших нужд вы можете проверить Pisa/xhtml2pdf. Вы бы сгенерировали свой HTML-код с помощью шаблона Jinja, а затем использовали Pisa для преобразования HTML в PDF. Пиза построена поверх ReportLab.
Изменить: другой вариант, о котором я забыл, это wkhtmltopdf
Ответ 2
Посмотрите Инструмент ReportLab Toolkit.
Однако вы можете использовать шаблоны только с коммерческой версией.
Ответ 3
Теперь в блоке появился новый парень под названием WeasyPrint.
Ответ 4
У меня было точно такое же требование, как и у OP. К сожалению, WeasyPrint не был жизнеспособным решением, потому что мне нужно очень точное позиционирование и поддержку штрих-кодов. Через несколько дней работы я закончил XML-обертку reportlab с поддержкой Jinja2.
Код можно найти на GitHub
включая пример XML, который генерирует следующие PDF.
Ответ 5
Как насчет python/jinja до rst/html и html/rst to pdf с помощью rst2pdf или pandoc.
Оба из них хорошо сработали для меня, но. например, plaes, я могу попробовать Weasyprint в будущем.
Ответ 6
Если вы хотите использовать существующий PDF как шаблон, не изменяя оригинальный документ, вы можете использовать редактор шаблонов Dhek, который позволяет определять область (границы, имя, тип) в отдельном файле шаблона.
Шаблон сохраняется в формате JSON, поэтому его можно разобрать на Python, заполнить области над PDF и сгенерировать окончательный документ (например, со значениями из веб-формы).
См. документацию на https://github.com/applicius/dhek.
Ответ 7
Какой более точный инструмент для PDF в Python, который работает как 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
Результат Латексный источник: ./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:
![введите описание изображения здесь]()
Литература: