Unicode-символы - это блоки в Geraldo / ReportLab, сгенерированном PDF - PullRequest
3 голосов
/ 31 августа 2011

Я сталкиваюсь с некоторыми проблемами, связанными с Unicode, при создании отчетов PDF с использованием Geraldo и ReportLab.

Когда строки Unicode, содержащие азиатские символы, передаются в отчет, они отображаются в выходном PDF-файле в виде черных ящиков. Этот пример (http://dl.dropbox.com/u/2627296/report.pdf) был создан с использованием следующего кода:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from geraldo import Report, ReportBand, ObjectValue
from geraldo.generators import PDFGenerator

class UnicodeReport(Report):    
    title = 'Report'

    class band_detail(ReportBand):
        elements = [ObjectValue(attribute_name='name')]

if __name__ == '__main__':
    objects = [{'name': u'한국어/조선말'}, {'name': u'汉语/漢語'}, {'name': u'オナカップ'}]    
    rpt = UnicodeReport(queryset=objects)
    rpt.generate_by(PDFGenerator, filename='/tmp/report.pdf')

Я использую Python 2.7.1, Geraldo 0.4.14 и ReportLab 2.5. Система Ubuntu 11.04 64-разрядная. Файл .oy также имеет кодировку UTF-8. Черные ящики видны при просмотре PDF в Document Viewer 2.32.0, Okular 0.12.2 и Adobe Reader 9.

Любая помощь очень ценится, спасибо.

1 Ответ

1 голос
/ 31 августа 2011

Вы должны указать имя шрифта, как в официальном примере " Дополнительные шрифты ".Используйте additional_fonts и default_style:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from geraldo import Report, ReportBand, ObjectValue
from geraldo.generators import PDFGenerator

class UnicodeReport(Report):    
    title = 'Report'
    additional_fonts = {
        'wqy': '/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc'
    }
    default_style = {'fontName': 'wqy'}

    class band_detail(ReportBand):
        elements = [ObjectValue(attribute_name='name')]

if __name__ == '__main__':
    objects = [{'name': u'한국어/조선말'}, {'name': u'汉语/漢語'}, {'name': u'オナカップ'}]    
    rpt = UnicodeReport(queryset=objects)
    rpt.generate_by(PDFGenerator, filename='/tmp/report.pdf')

ObjectValue() также имеет именованный параметр style:

elements = [ObjectValue(attribute_name='name', style={'fontName': 'wqy'})]

Этот шрифт с открытым исходным кодом и его можно загрузить здесь:http://sourceforge.net/projects/wqy/files/ (я думаю, он поставляется с Ubuntu 11.04)

...