отображать необычные глифы в pdf-файлах reportlab

Может ли reportlab отображать необычные глифы, такие как ????? Если да, то как?

Я установил шрифт Symbola, который, как я проверил, содержит глиф для ????, но когда я отображаю его с помощью PDFTextObject со шрифтом, установленным на Symbola, он отображается в виде поля.

Вот некоторый код, который должен воспроизвести проблему. Обратите внимание, что в Ubuntu, чтобы установить шрифт для каждого пользователя, его можно поместить в папку с именем .fonts в домашнем каталоге пользователя. Reportlab не просматривает эту папку, поэтому я указал ее точное местоположение.

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
width, height = A4
from reportlab.lib.colors import red
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
# NOTE: provide the location of Symbola.ttf on your setup...
pdfmetrics.registerFont(TTFont("Symbola", "/home/my-user-name/.fonts/Symbola.ttf"))
c = canvas.Canvas("test-symbola-font.pdf")
to = c.beginText()
to.setTextOrigin(50,height-50)
to.setFont("Symbola", 30)
to.setFillColor(red)
to.textLine(u"Some symbols: ????????????")
c.drawText(to)
c.showPage()
c.save()

3 символа эмодзи (потрясенное лицо, лицо с поднятыми руками и рука, делающая символ ОК) представлены в Symbola, но в PDF-файле они отображаются в виде прямоугольников вокруг вопросительных знаков. Это верно как для ветки reportlab «по умолчанию» из репозитория mercurial на битбакете (pip reports версии 2.7), так и для обычной установленной версии pip (pip reports 3.0 — странно!).

В обоих случаях глифы из Symbola встроены, но я не нашел способа определить, КАКИЕ глифы встроены! pdffonts сообщает о встроенном шрифте Symbola как «TrueType», а не «CID TrueType», 16-битном TrueType - возможно, это проблема ?? Я просмотрел сгенерированный PDF-файл с помощью утилиты предварительной проверки Acrobat, и действительно, 3 глифа отсутствуют.

Шрифт Symbola прекрасно работает в моей системе — такие глифы, как эти эмодзи, отображаются в браузерах, терминалах и т. д., и я проверил, что они действительно исходят от Symbola.

Обновление: отсутствующие глифы, о которых сообщает Acrobat, имеют кодовые точки U+F080, U+F081 и U+F082 (т. е. эти кодовые точки находятся в тексте в формате pdf). Они неверны (должны быть U+1F631, U+1F64C и U_1F44C).


person drevicko    schedule 24.02.2014    source источник
comment
Не могли бы вы предоставить минимальный пример кода?   -  person Fookatchu    schedule 24.02.2014
comment
добавил пример. Чтобы убедиться, что это ошибка, а не мое невежество, я зарегистрировал ошибка   -  person drevicko    schedule 25.02.2014
comment
Может быть, это не шрифт, а проблема с юникодом. reportlab хочет иметь объекты unicode, а не объекты str. в этом случае вы предоставляете строку str, которая может быть неправильно закодирована. Поскольку у меня нет этого шрифта и я не вижу глифов, это все, о чем я могу думать.   -  person Fookatchu    schedule 25.02.2014
comment
Спасибо, что подумали об этом (: я изменил его на строку Unicode, и проблема не устранена. Теперь я вижу, что кодовые точки, о которых сообщает acrobad как отсутствующие, неверны!   -  person drevicko    schedule 26.02.2014


Ответы (1)


Это была ошибка в reportlab, который исправлен. Если вы столкнулись с этой ошибкой, проверьте репозиторий mercurial и установите pip оттуда (желательно в виртуальную среду!). Исправление также появится в скором выпуске.

person drevicko    schedule 07.05.2014