Python библиотека за динамични документи

Искам да напиша скрипт, който генерира отчети за всеки екип в моето звено, където всеки отчет използва един и същ шаблон, но където числата, специфични за всеки екип, се използват за всеки отчет. Докладът трябва да бъде във формат като .pdf, който непрограмистите да знаят как да отварят и четат. Това е в много отношения подобно на rmarkdown за R, но отчетите, които искам да генерирам, се основават на данни от код, който вече е написан на python.

Решението, което търся, не се нуждае от директно експортиране в pdf. Може да експортира в markdown и тогава знам как да конвертирам. Не се нуждая от по-елегантно форматиране от това, което предлага markdown. Не е необходимо да е маркдаун, но знам как да направя всичко останало в маркдаун, само ако намеря начин за динамично попълване на числа и текст в шаблон за маркдаун от код на Python.

Това, от което се нуждая, е нещо, което е подобно на кодовия блок по-долу, но в по-голям мащаб и вместо да отпечатва изход на екрана, това ще бъде запазено във файл (.md или .pdf), който след това може да бъде споделен с всеки екип.

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

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

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-Bash:

    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