ReportLab: Как выровнять текстовый объект?

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

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

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

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

Любые идеи?

Ответы

Ответ 1

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

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

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

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

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

(area_width - string_width) / 2

Малый тест script Я использовал http://pastebin.com/PQxzi1Kf (код не красавица, но он работает).

Ответ 2

Reportlab имеет метод drawCentredString (ориентирован на английскую орфографию). Это центрирует ваш текст по заданной координате x.

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