Библиотека Python для динамических документов

Я хочу написать сценарий, который генерирует отчеты для каждой команды в моем подразделении, где каждый отчет использует один и тот же шаблон, но где для каждого отчета используются числа, характерные для каждой команды. Отчет должен быть в таком формате, как .pdf, который непрограммисты знают, как открывать и читать. Это во многом похоже на rmarkdown для R, но отчеты, которые я хочу создать, основаны на данных из кода, уже написанного на python.

Решение, которое я ищу, не требует прямого экспорта в pdf. Он может экспортировать в уценку, а потом я знаю, как конвертировать. Мне не нужно более сложное форматирование, чем то, что обеспечивает уценка. Это не обязательно уценка, но я знаю, как сделать все остальное в уценке, если только найду способ динамически заполнять числа и текст в шаблоне уценки из кода python.

Мне нужно что-то похожее на блок кода ниже, но в большем масштабе, и вместо вывода вывода на экран это будет сохранено в файл (.md или .pdf), которым затем можно будет поделиться с каждой командой.

user = {'name':'John Doe', 'email':'[email protected]'}
print('Name is {}, and email is {}'.format(user["name"], user["email"]))

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

user = {'name':'John Doe', 'email':'[email protected]'}
template = 'Name is `user["name"]`, and email is `user["email"]`'
output = render(template, user)

Пытаясь найти эквивалент rmarkdown в python, я нашел много указателей на Jupyter Notebook, с которым я знаком и который мне очень нравится, но это не то, что я ищу, так как смысл не в том, чтобы делиться кодом , только визуализированный вывод.


person TheIceBear    schedule 20.11.2019    source источник
comment
Добро пожаловать в Stack Overflow. Вопросы, в которых нас просят порекомендовать или найти книгу, инструмент, программную библиотеку, учебное пособие или другой сторонний ресурс, не относятся к теме Stack Overflow, поскольку они, как правило, привлекают самоуверенные ответы и спам. Вместо этого опишите проблему и то, что уже было сделано для ее решения.   -  person Chris    schedule 21.11.2019


Ответы (2)


Поскольку за этот вопрос проголосовали, я хочу ответить на свой вопрос, так как я нашел решение, которое идеально подошло мне. В конце концов, я поделился этими отчетами в репозитории, поэтому я пишу отчеты в уценке и не конвертирую их в PDF. Причина, по которой я все еще думаю, что это ответ на мой первоначальный вопрос, заключается в том, что это работает аналогично созданию уценки в Rmarkdown, которая была сутью моего вопроса, и уценку можно легко преобразовать в PDF.

Я решил это, используя библиотеку для HTML-страниц, созданных бэкэндом. Мне довелось использовать jinja2, но есть много других вариантов.

Для начала вам понадобится файл шаблона в уценке. Допустим, это template.md:

## Overview
**Name:** {{repo.name}}<br>
**URL:** {{repo.url}}

| Branch name | Days since last edit |
|---|---|
{% for branch in repo.branches %}
|{{branch[0]]}}|{{branch[1]}}|
{% endfor %}

И затем вы использовали это в своем скрипте Python:

from jinja2 import Template
import codecs

#create an dict will all data that will be populate the template
repo = {}
repo.name = 'training-kit'
repo.url = 'https://github.com/github/training-kit'
repo.branches = [
    ['master',15],
    ['dev',2]
]

#render the template
with open('template.md', 'r') as file:
  template = Template(file.read(),trim_blocks=True)
rendered_file = template.render(repo=repo)

#output the file
output_file = codecs.open("report.md", "w", "utf-8")
output_file.write(rendered_file)
output_file.close()

Если вы согласны с тем, что ваш динамический документ находится в уценке, все готово, и отчет записывается в report.py. Если вы хотите PDF, вы можете использовать pandoc для конвертации.

person TheIceBear    schedule 27.08.2020

Я настоятельно рекомендую установить и использовать библиотеку pyFPDF, которая позволяет вам писать и экспортировать PDF-файлы непосредственно из python. Библиотека была перенесена с php и предлагает ту же функциональность, что и php-вариант.

1.) Клонируйте и установите pyFPDF

Гит-Баш:

    git clone https://github.com/reingart/pyfpdf.git
    cd pyfpdf
    python setup.py install

2.) После успешной установки вы можете использовать код Python так же, как если бы вы работали с fpdf в php, например:

    from fpdf import FPDF

    pdf = FPDF()
    pdf.add_page()
    pdf.set_xy(0, 0)
    pdf.set_font('arial', 'B', 13.0)
    pdf.cell(ln=0, h=5.0, align='L', w=0, txt="Hello", border=0)
    pdf.output('myTest.pdf', 'F')

Для получения дополнительной информации посетите: https://pypi.org/project/fpdf/

Для работы с репозиторием клонов pyFPDF из: https://github.com/reingart/pyfpdf

Документация pyFPDF: https://pyfpdf.readthedocs.io/en/latest/Tutorial/index.html

person mZed    schedule 20.11.2019