Джинджа, как для PDF в Python - PullRequest
       44

Джинджа, как для PDF в Python

15 голосов
/ 14 января 2010

Я ищу лучший точный инструмент для PDF на Python, который работает как Jinja для HTML.

Каковы ваши предложения?

Ответы [ 7 ]

12 голосов
/ 14 января 2010

Как ответил jbochi, ReportLab является основой почти для всех проектов Python, которые генерируют PDF.

Но для ваших нужд вы можете проверить Пиза / xhtml2pdf . Вы должны сгенерировать свой HTML с помощью шаблона Jinja, а затем использовать Pisa для преобразования HTML в PDF. Пиза построена на основе ReportLab.

Редактировать: другой вариант, о котором я забыл, это wkhtmltopdf

4 голосов
/ 14 января 2010

Взгляните на ReportLab Toolkit .

Вы можете использовать шаблоны только с коммерческой версией.

3 голосов
/ 18 июля 2012

У меня было точно такое же требование, как и у ОП. К сожалению, WeasyPrint не был жизнеспособным решением, потому что мне нужно было очень точное позиционирование и поддержка штрих-кода. После нескольких дней работы я закончил обертку reportlab XML с поддержкой Jinja2.

Код можно найти на GitHub включая пример XML , который генерирует следующее PDF .

3 голосов
/ 10 февраля 2012

В блоке появился новый ребенок по имени WeasyPrint .

1 голос
/ 20 июня 2017

Какой более точный инструмент для 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:

enter image description here

Ссылка:

1 голос
/ 18 мая 2012

Как насчет python / jinja в rst / html и html / rst в pdf, используя rst2pdf или pandoc .

Оба из них хорошо сработали для меня, но. Как и я, я могу попробовать Weasyprint в будущем.

0 голосов
/ 17 июля 2014

Если вы хотите использовать существующий PDF в качестве шаблона, не изменяя оригинальный документ, вы можете использовать редактор шаблонов Dhek, который позволяет определять область (границы, имя, тип) в отдельном файле шаблона.

Шаблон сохраняется в формате JSON, чтобы его можно было проанализировать в Python, чтобы заполнить области поверх PDF и создать окончательный документ (например, со значениями из веб-формы).

См. Документацию по https://github.com/applicius/dhek.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...