ReportLab: Как выровнять текстовый объект? - PullRequest
14 голосов
/ 11 февраля 2011

У меня есть следующий код ReportLab:

    t = c.beginText()
    t.setFont('Arial', 25)
    t.setCharSpace(3)
    t.setTextOrigin(159,782)
    t.textLine("Some string")
    c.drawText(t)

Чего я хочу добиться: иметь 3 (пикселя?) Пробела между каждым символом (setCharSpace) и выровнять полученную строку по центру определенной области на странице

Насколько я нашел, текстовый объект - это единственный способ указать пробел между символами.

Есть идеи?

Ответы [ 3 ]

16 голосов
/ 11 февраля 2011

В основном вам нужно только вычислить ширину строки, ширину области, в которой вы хотите отцентрировать ее, и все готово.

Используйте Canvas.stringWidth , чтобыопределить ширину, которую занимает данная строка (со шрифтом и размером).Он не учитывает межсимвольный интервал, но я провел несколько тестов, предлагающих исправить это.

def stringWidth2(string, font, size, charspace):
    width = stringWidth(string, font, size)
    width += (len(string) - 1) * charspace
    return width

Все, что он делает, это использует исходный stringWidth для вычисления ширины строки, идобавить дополнительные пробелы между символами.Теперь у меня нет опыта работы с типографикой, поэтому я не уверен, что такие функции шрифта, как кернинг, могут сделать это непригодным для использования.

Если вы отрегулируете свое происхождение x таким образом, ваша строка будет отцентрирована.1012 *

Небольшой тестовый скрипт, который я использовал http://pastebin.com/PQxzi1Kf (код это не красота, но он работает).

1 голос
/ 09 августа 2015

У Reportlab есть метод, drawCentredString (по центру британского правописания). Это будет центрировать ваш текст по заданной координате х.

http://www.reportlab.com/apis/reportlab/2.4/pdfgen.html

0 голосов
/ 21 мая 2017

Попробуйте: <para alignment="center"> От: http://two.pairlist.net/pipermail/reportlab-users/2006-June/005092.html

...