pymupdf выровнять текст по центру

Мне нужно написать функцию, которая будет вставлять текст на страницу с горизонтальным выравниванием по центру в существующем документе, не удаляя имеющееся содержимое. Прочитал документацию pymupdf, там приведён такой пример:

import pymupdf

doc = pymupdf.open()  # new or existing PDF
page = doc.new_page()  # new page, or choose doc[n]

# write in this overall area
rect = pymupdf.Rect(100, 100, 300, 150)

# partition the area in 4 equal sub-rectangles
CELLS = pymupdf.make_table(rect, cols=4, rows=1)

t1 = "text with rotate = 0."  # these texts we will written
t2 = "text with rotate = 90."
t3 = "text with rotate = 180."
t4 = "text with rotate = 270."
text = [t1, t2, t3, t4]
red = pymupdf.pdfcolor["red"]  # some colors
gold = pymupdf.pdfcolor["gold"]
blue = pymupdf.pdfcolor["blue"]
"""
We use a Shape object (something like a canvas) to output the text and
the rectangles surrounding it for demonstration.
"""
shape = page.new_shape()  # create Shape
for i in range(len(CELLS[0])):
    shape.draw_rect(CELLS[0][i])  # draw rectangle
    shape.insert_textbox(
        CELLS[0][i], text[i], fontname="hebo", color=blue, rotate=90 * i
    )

shape.finish(width=0.3, color=red, fill=gold)

shape.commit()  # write all stuff to the page
doc.ez_save(__file__.replace(".py", ".pdf"))

Также там написано: Some default values were used above: font size 11 and text alignment “left”.

Ещё:

insert_textbox(rect, buffer, fontsize=11, fontname='helv', fontfile=None, idx=0, color=None, fill=None, render_mode=0, border_width=1, encoding=TEXT_ENCODING_LATIN, expandtabs=8, align=TEXT_ALIGN_LEFT, charwidths=None, rotate=0, morph=None, stroke_opacity=1, fill_opacity=1, oc=0, overlay=True)

Написал по мотивам примера такой код, заменив значение параметра align в функции insert_textbox:

import pymupdf

# Открываем существующий PDF-файл
doc = pymupdf.open("без данных.pdf")  # Укажите путь к вашему существующему файлу
page = doc[6]  # Получаем 7-ю страницу (индекс 6)

# Определяем область для текста
rect = pymupdf.Rect(100, 100, 300, 150)


CELLS = pymupdf.make_table(rect, cols=1, rows=1)

t1 = "Почему этот текст выравнивается по левому краю?"  # Текст для вставки
text = [t1]
red = pymupdf.pdfcolor["red"]  # Цвет рамки
gold = pymupdf.pdfcolor["gold"]
blue = pymupdf.pdfcolor["blue"]

# Создаем объект Shape для вывода текста
shape = page.new_shape()  # Создаем Shape
for i in range(len(CELLS[0])):
    shape.draw_rect(CELLS[0][i])  # Рисуем прямоугольник
    shape.insert_textbox(
        CELLS[0][i], text[i], fontname="hebo", color=blue, rotate=90 * i, align='TEXT_ALIGN_CENTER'
    )

shape.finish(width=0.3, color=red, fill=gold)

shape.commit()  # Записываем все на страницу

# Сохраняем изменения в файл
doc.save("output.pdf")  # Или используйте `doc.ez_save('output.pdf')`
doc.close()

Но текст всё равно выравнивается по левому краю (см. скриншот)

скриншот

Помогите понять, что я делаю не так. Если есть какие-то рабочие варианты, которые могут вставить текст в существующий pdf, центрировав его по центру так, чтобы остальное содержимое файла не затёрлось, буду благодарен за подсказку. Конечная цель - написать функцию, которая будет вставлять заголовок по центру, и если он слишком длинный, то переносить не влезающие слова на следующую строку.


Ответы (1 шт):

Автор решения: Pavel

В результате методом тыка нашёл вот такое решение: Выравнивание по центру задаётся параметром align=1.

import fitz

def add_title(context):
    # Открываем существующий PDF
    doc = fitz.open(context['file_name'])

    # Загружаем первую страницу для редактирования
    page = doc.load_page(context['page_num'])
    font_path = context['font_path']

    # Вставка кастомного шрифта на страницу
    fontname = 'CustomFont'
    # Загрузка кастомного шрифта
    page.insert_font(fontfile=font_path, fontname=fontname)

    # Устанавливаем начальные координаты для текста
    current_y = context['y_coordinate']


    # Параметры страницы
    page_width = page.rect.width
    margin = context['margin']

    # Прямоугольник для вставки текста
    text_rect = fitz.Rect(margin, current_y, page_width - margin, current_y + context['font_size'] * 10)

    # Вставляем текст с кастомным шрифтом
    page.insert_textbox(text_rect, context['text'], fontsize=context['font_size'], fontname='CustomFont', fill=context['color'], align=1)
    # current_y += 90

    # Сохраняем изменения в новый файл
    doc.save(context['output_path'], incremental=True, encryption=0)
    doc.close()
→ Ссылка