Уведомления

Группа в Telegram: @pythonsu

#1 Март 19, 2019 19:19:29

hiroz
Зарегистрирован: 2019-03-19
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

библиотека reportlab. Кириллица в таблицах

Здравствуйте. Хочу создавать 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()
Подскажите, пожалуйста, как заставить кириллицу работать в этой библиотеке или посоветуйте другую с такими же фичами. Python 3.5.3, reportlab 3.5.13

Отредактировано hiroz (Март 19, 2019 19:30:53)

Офлайн

#2 Март 19, 2019 20:04:09

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

библиотека reportlab. Кириллица в таблицах

hiroz
или посоветуйте другую с такими же фичами.
Точно таких фич в других библиотеках не найдете, на то они и другие библиотеки.

Дальше все зависит от задачи.
hiroz
Хочу создавать pdf файлы в python 3.

Суммируя мой опыт.
1. В простейшем случае вы можете создать pdf из matplotlib рисуйте как хотите…
2. Судя по вашему посту вам надо что-то посложнее таблицы, многостраничных документ например…
Возможно вас тогда устроит sphinx есть небольшой набор простых стилей, да и входной язык несравненно лаконичнее и приятнее того что вам дает reportlab. Конечно это за счет менее гибкого описания формата.
3. Если этого не хватает то следующий по широте возможностей LaTeX. Да он своеобразный, но это многие десятки лет опыта изготовления сложных документов. Автоматизация генерации отчетов в латехе может быть выполнена тьмой способов, шаблонизаторами (mako,jinja,…) вставкой скриптов в latex http://www.texample.net/weblog/2008/oct/24/embedding-python-latex/, использованим питона как “входного языка tex” https://jeltef.github.io/PyLaTeX/current/index.html.

Но когда я вижу в рекомендациях на сайте https://www.reportlab.com/snippets/25/ такое:
 # 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

То мне сразу приходит в голову мысль что поделкой таких умельцев я буду пользоваться в последнюю очередь. Даже PyLaTeX, который еще то извращение, и тот лучше будет.






Отредактировано doza_and (Март 19, 2019 20:06:04)

Офлайн

#3 Март 19, 2019 20:21:01

hiroz
Зарегистрирован: 2019-03-19
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

библиотека reportlab. Кириллица в таблицах

Спасибо за ответ. Вы правильно меня поняли, мне нужны именно многостраничные документы. Именно с диаграммами и таблицами.

doza_and
Да он своеобразный, но это многие десятки лет опыта изготовления сложных документов. Автоматизация генерации отчетов в латехе может быть выполнена тьмой способов, шаблонизаторами (mako,jinja,…)
Перед reportlabом я рассматривал этот вариант и мне он показался очень уж замороченным, похоже придётся подумать ещё раз.

Офлайн

#4 Март 20, 2019 00:34:53

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

библиотека reportlab. Кириллица в таблицах

Так вы подробнее напишите что хотите делать. Тогда можно конкретнее будет и посоветовать.

Из шаблонизаторов лучше мако - он меньше конфликтует с фигурными скобками теха.
В другие форматы из латеха неплохо конвертирует документы pandoc.



Офлайн

#5 Март 20, 2019 06:25:39

hiroz
Зарегистрирован: 2019-03-19
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

библиотека reportlab. Кириллица в таблицах

doza_and
Так вы подробнее напишите что хотите делать. Тогда можно конкретнее будет и посоветовать.
Хочу выводить данные в pdf из mysql, нужна поддержка диаграм и таблиц, как я уже писал.

Офлайн

#6 Март 20, 2019 08:28:38

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

библиотека reportlab. Кириллица в таблицах

При такой постановке вам годится сфинкс или html который потом банально при помощи weasyprint или любых аналогичных средств скидываете в pdf.
Если формально подойти то:

  • поддержка диаграмм - есть (А что такое диаграммы? Ну картинки можно вставить);
  • поддержка таблиц - есть.

Но дальше вопросы кучей образуют ком.

Документ должен удовлетворять ГОСТ -XXXX, ISO-XXX, требованиям нормоконтроля?
Документ должен иметь возможность построения таблиц с объединением колонок, поворотом текста и т.п.?
Надо иметь возможность генерации наборов документов с рабочими перекрестными ссылками между ними?
….
И т. д. и т. п. Это и определяет выбор инструмента.



Офлайн

#7 Март 20, 2019 09:08:57

hiroz
Зарегистрирован: 2019-03-19
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

библиотека reportlab. Кириллица в таблицах

doza_and
При такой постановке вам годится сфинкс или html который потом банально при помощи weasyprint или любых аналогичных средств скидываете в pdf.
Теперь уже думаю взять чего потяжелее, чтобы потом не доосваивать, если нужно будет что-то. Вот, выбираю между библиотекой libreoffice и latex, чего с той и с другой стороны посоветуйте?
doza_and
При такой постановке вам годится сфинкс или html который потом банально при помощи weasyprint или любых аналогичных средств скидываете в pdf.Если формально подойти то:
Ну в общем, удовлетворять не обязан. Форматирование таблиц нужно, да. Ссылки не нужны. Под диаграммами я имел ввиду что-то вроде графиков в matplotlib или любых графиков в текстовых процессорах office like. Вот что-то такое

Отредактировано hiroz (Март 20, 2019 09:09:52)

Офлайн

#8 Март 20, 2019 09:29:42

hiroz
Зарегистрирован: 2019-03-19
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

библиотека reportlab. Кириллица в таблицах

Ух, всё работает. Оказалось что при регестрировании шрифтов, вот здесь, тобишь:

 pdfmetrics.registerFont(TTFont('FreeSans', 'FreeSans.ttf'))
Он подхватывает шрифт из папки из которой запускается. Этого шрифта там не было, вот он и не работал. Почему он выводит русские строки с помощью DrawString, когда в папке нет шрифта – вопрос хороший, есть предоположение, что у таблиц и строк разные дефолтные шрифты, НО ПОЧЕМУ? Вот пример работающего кода:
 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()
Очевидно, позаботесь о том, чтобы в папке рядом с файлом был этот самый “DejaVuSerif.ttf”. Всех благ

Отредактировано hiroz (Март 20, 2019 09:42:13)

Офлайн

#9 Март 20, 2019 23:55:43

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

библиотека reportlab. Кириллица в таблицах

hiroz
выбираю между библиотекой libreoffice и latex
Ну что такое “библиотека libreoffice” я не знаю. Мы пробовали pyuno. Но он не зашел, многовато лишних телодвижений и либра долго открывает большие файлы (win32com катастрофически!!! медленный). Из этого семейства более или менее удовлетворительный https://python-docx.readthedocs.io/en/latest/ . Латех оказалось проще отлаживать да и поддержка пользователей у него гораздо шире. Т.е. практически по любому вопросу в латехе можно нарыть решения, а реализовать генерацию файлов задача вообще плевая.

hiroz
что у таблиц и строк разные дефолтные шрифты, НО ПОЧЕМУ?
Вот о чем я и писал. Качество кода вызывает сомнения. Где гарантия что после того как вы потратите кучу времени на автоматизацию в последний день перед сдачей проекта не вылезет непреодолимый затык?



Офлайн

#10 Март 21, 2019 19:22:40

hiroz
Зарегистрирован: 2019-03-19
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

библиотека reportlab. Кириллица в таблицах

doza_and
Вот о чем я и писал. Качество кода вызывает сомнения. Где гарантия что после того как вы потратите кучу времени на автоматизацию в последний день перед сдачей проекта не вылезет непреодолимый затык?
Мне кажется вы правы. Мигрирую. Мако советуете?

Отредактировано hiroz (Март 21, 2019 19:43:55)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version