Форум сайта python.su
Здравствуйте. Хочу создавать pdf файлы в python 3. Моё внимание остановилось на reportlab из-за того, что это хорошо развитая, документированная библиотека с поддержкой таблиц и графиков. Но немного освоившись я заметил, что он плох в кирилице. Ладно, импортировал шрифт, строки он начал выводить. Дошёл до таблиц, а там снова квадратики вместо символов. Гуглил – не помогает. Вот пример программы:
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
def table_fonts():
doc = SimpleDocTemplate("table_fonts.pdf", pagesize=letter)
story = []
data = [['ф_{}'.format(x) for x in range(1, 6)],
['а', 'ф', 'ф', 'ф', 'ф']
]
tblstyle = TableStyle([('TEXTFONT', (0, 0), (0, 1), 'FreeSans') ]) #Использую импортированный шрифт
tbl = Table(data)
tbl.setStyle(tblstyle)
story.append(tbl)
doc.build(story)
if __name__ == '__main__':
pdfmetrics.registerFont(TTFont('FreeSans', 'FreeSans.ttf')) #Импортирую шрифт.
table_fonts()
Отредактировано hiroz (Март 19, 2019 19:30:53)
Офлайн
hirozТочно таких фич в других библиотеках не найдете, на то они и другие библиотеки.
или посоветуйте другую с такими же фичами.
hiroz
Хочу создавать pdf файлы в python 3.
# Define a fifth label with a black border, text padding # and position it closer to the chart self.contents[0].slices[4].label_boxStrokeColor = black self.contents[0].slices[4].label_height = 22 self.contents[0].slices[4].label_topPadding = 2 self.contents[0].slices[4].label_leftPadding = 6 self.contents[0].slices[4].label_rightPadding = 6 self.contents[0].slices[4].labelRadius = 1.15
Отредактировано doza_and (Март 19, 2019 20:06:04)
Офлайн
Спасибо за ответ. Вы правильно меня поняли, мне нужны именно многостраничные документы. Именно с диаграммами и таблицами.
doza_andПеред reportlabом я рассматривал этот вариант и мне он показался очень уж замороченным, похоже придётся подумать ещё раз.
Да он своеобразный, но это многие десятки лет опыта изготовления сложных документов. Автоматизация генерации отчетов в латехе может быть выполнена тьмой способов, шаблонизаторами (mako,jinja,…)
Офлайн
Так вы подробнее напишите что хотите делать. Тогда можно конкретнее будет и посоветовать.
Из шаблонизаторов лучше мако - он меньше конфликтует с фигурными скобками теха.
В другие форматы из латеха неплохо конвертирует документы pandoc.
Офлайн
doza_andХочу выводить данные в pdf из mysql, нужна поддержка диаграм и таблиц, как я уже писал.
Так вы подробнее напишите что хотите делать. Тогда можно конкретнее будет и посоветовать.
Офлайн
При такой постановке вам годится сфинкс или html который потом банально при помощи weasyprint или любых аналогичных средств скидываете в pdf.
Если формально подойти то:
Офлайн
doza_andТеперь уже думаю взять чего потяжелее, чтобы потом не доосваивать, если нужно будет что-то. Вот, выбираю между библиотекой libreoffice и latex, чего с той и с другой стороны посоветуйте?
При такой постановке вам годится сфинкс или html который потом банально при помощи weasyprint или любых аналогичных средств скидываете в pdf.
doza_andНу в общем, удовлетворять не обязан. Форматирование таблиц нужно, да. Ссылки не нужны. Под диаграммами я имел ввиду что-то вроде графиков в matplotlib или любых графиков в текстовых процессорах office like. Вот что-то такое
При такой постановке вам годится сфинкс или html который потом банально при помощи weasyprint или любых аналогичных средств скидываете в pdf.Если формально подойти то:
Отредактировано hiroz (Март 20, 2019 09:09:52)
Офлайн
Ух, всё работает. Оказалось что при регестрировании шрифтов, вот здесь, тобишь:
pdfmetrics.registerFont(TTFont('FreeSans', 'FreeSans.ttf'))
from reportlab.lib import colors from reportlab.lib.pagesizes import letter from reportlab.platypus import SimpleDocTemplate, Table, TableStyle from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont def table_fonts(): doc = SimpleDocTemplate("table_fonts.pdf", pagesize=letter) story = [] data = [['ф_{}'.format(x) for x in range(1, 6)], ['фф', 'ф', 'ф', 'ф', 'ф'] ] tblstyle = TableStyle([('FONT', (0, 0), (-1, 1), 'DejaVuSerif', 24) ]) tbl = Table(data) tbl.setStyle(tblstyle) story.append(tbl) doc.build(story) if __name__ == '__main__': pdfmetrics.registerFont(TTFont('DejaVuSerif', 'DejaVuSerif.ttf')) table_fonts()
Отредактировано hiroz (Март 20, 2019 09:42:13)
Офлайн
hirozНу что такое “библиотека libreoffice” я не знаю. Мы пробовали pyuno. Но он не зашел, многовато лишних телодвижений и либра долго открывает большие файлы (win32com катастрофически!!! медленный). Из этого семейства более или менее удовлетворительный https://python-docx.readthedocs.io/en/latest/ . Латех оказалось проще отлаживать да и поддержка пользователей у него гораздо шире. Т.е. практически по любому вопросу в латехе можно нарыть решения, а реализовать генерацию файлов задача вообще плевая.
выбираю между библиотекой libreoffice и latex
hirozВот о чем я и писал. Качество кода вызывает сомнения. Где гарантия что после того как вы потратите кучу времени на автоматизацию в последний день перед сдачей проекта не вылезет непреодолимый затык?
что у таблиц и строк разные дефолтные шрифты, НО ПОЧЕМУ?
Офлайн
doza_andМне кажется вы правы. Мигрирую. Мако советуете?
Вот о чем я и писал. Качество кода вызывает сомнения. Где гарантия что после того как вы потратите кучу времени на автоматизацию в последний день перед сдачей проекта не вылезет непреодолимый затык?
Отредактировано hiroz (Март 21, 2019 19:43:55)
Офлайн