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