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 шт):
В результате методом тыка нашёл вот такое решение: Выравнивание по центру задаётся параметром 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()