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:

введите описание изображения здесь

Литература: