Символы Unicode - это блоки в Geraldo/ReportLab, сгенерированном PDF

Я сталкиваюсь с некоторыми проблемами, связанными с 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 ответ

Решение

Вы должны указать название шрифта, как в официальном примере " Дополнительные шрифты". использование 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)

Другие вопросы по тегам