Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Посмотри на Инструментарий ReportLab.

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

Теперь в квартале появился новый ребенок по имени WeasyPrint.

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

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

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

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

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

Использованная литература:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top