Уведомления

Группа в Telegram: @pythonsu

#1 Март 5, 2023 20:46:36

Ematten
Зарегистрирован: 2023-03-05
Сообщения: 12
Репутация: +  1  -
Профиль   Отправить e-mail  

[РЕШЕНО] Определить пустую часть страницы pdf файла и нарисовать символ

Привет.

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

Дано: скрипт, которому на вход будет дан pdf файл (обязательно созданный из офисного документа, то есть в pdf не изображения, а слой с текстом). Скрипт будет определять, на каких страницах отсутствует текст в количестве строк N+1 от конца последнего абзаца до нижнего колонтитула (его высота задана в скрипте). На месте этой пустой области скрипт будет рисовать какой-то символ.

Pdf файлы обрабатываю через PyPDF2. Вопрос с инструментом (готовой питоновской библиотекой, если такая есть) для обнаружение пустых мест между текстом и нижним колонтитулом. OpenCV? Что-то еще?

По принципу, все, конечно, зависит от библиотеки, но в первом приближении вижу такое исполнение: найти ширину строки в у.е. и кол-во строк. Умножив, получаю примерную (точную не нужно) заполненность страницы в у.е. и сравниваю с у.е. полностью заполненной страницы. Если разница получится больше или равна N+1 у.е., то рисую знак. Чем рисовать, пока не понял.

Отредактировано Ematten (Март 7, 2023 07:27:20)

Офлайн

#2 Март 6, 2023 11:11:48

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

[РЕШЕНО] Определить пустую часть страницы pdf файла и нарисовать символ

приложите пример файла входящего, приложите пример файла который должен быть на выходе, т.е руками сделайте что-нужно.

Офлайн

#3 Март 6, 2023 11:42:38

Ematten
Зарегистрирован: 2023-03-05
Сообщения: 12
Репутация: +  1  -
Профиль   Отправить e-mail  

[РЕШЕНО] Определить пустую часть страницы pdf файла и нарисовать символ

Прикрепил пример. Нужно найти расстояние А (между последней строкой и верхней границей нижнего колонтитула). Дальше беру, допустим, 90% этого расстояния и рисую по центру в пустом пространстве символ В высотой эти 90%.

Прикреплённый файлы:
attachment пример.jpg (351,3 KБ)

Офлайн

#4 Март 6, 2023 22:01:49

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

[РЕШЕНО] Определить пустую часть страницы pdf файла и нарисовать символ

 import fitz
pdf_file = '/home/xam/Рабочий стол/Без имени 1.pdf'
image_file ='/home/xam/Загрузки/кукуруза.png'
output_file = '/home/xam/Рабочий стол/output.pdf'
page_num = 0
# открываем
with fitz.open(pdf_file) as doc:
    page = doc[page_num]
    # ширина высота страницы
    page_width, page_height = page.mediabox[2], page.mediabox[3]
    # получаем текстовыый блок
    text_blocks = page.get_text_blocks()
    # открываем картинку
    img = fitz.Pixmap(image_file)
    # выставляем размеры
    x, y = 0, text_blocks[0][3]
    w, h = page_width, page_height - text_blocks[0][3] - text_blocks[0][1]
    rect = fitz.Rect(x, y, x + w, y + h)
    # вставляем
    page.insert_image(rect, pixmap=img)
    # сохраняем
    doc.save(output_file)

Отредактировано xam1816 (Март 7, 2023 00:11:18)

Офлайн

#5 Март 7, 2023 07:26:32

Ematten
Зарегистрирован: 2023-03-05
Сообщения: 12
Репутация: +  1  -
Профиль   Отправить e-mail  

[РЕШЕНО] Определить пустую часть страницы pdf файла и нарисовать символ

Спасибо за пример, с определением пустого пространства я разобрался. Осталась вторая часть:

На месте этой пустой области скрипт будет рисовать какой-то символ.

В вашем примере вы вставляете картинку, у которой заранее определены параметры. В моем случае мне нужно вставить символ средствами питона исходя из полученных от fritz данных о пустом пространстве
 rect = fitz.Rect(x, y, x + w, y + h)

Судя по всему, для последней части я могу использовать insert_textbox из того же fritz. Вроде
 rc = page.insert_textbox(rect, text, fontsize = 48,
                   fontname = "Times-Roman",
                   fontfile = None,
                   align = 1) 

Или так - https://pymupdf.readthedocs.io/en/latest/recipes-text.html#how-to-fill-a-text-box

С алгоритмом определения размера шрифта на основе размера прямоугольника и с корректировкой определения размера прямоугольника из вашего примера я разберусь.

Благодарю за помощь!

Отредактировано Ematten (Март 7, 2023 07:36:19)

Офлайн

#6 Март 7, 2023 08:40:58

Ematten
Зарегистрирован: 2023-03-05
Сообщения: 12
Репутация: +  1  -
Профиль   Отправить e-mail  

[РЕШЕНО] Определить пустую часть страницы pdf файла и нарисовать символ

Собственно, итоговый код такой:

 #!/usr/bin/env python3
import fitz
pdf_file = '/home/user/Documents/tmp/in.pdf'
output_file = '/home/user/Documents/tmp/out.pdf'
page_num = 0
# открываем
with fitz.open(pdf_file) as doc:
    page = doc[page_num]
    # Ширина и высота страницы
    page_width, page_height = page.mediabox[2], page.mediabox[3]
    # Текстовый блок
    text_blocks = page.get_text("blocks")
    # Координаты пустого пространства для добавления текста
    new_box_x0 = page_width * 0.05
    new_box_y0 = text_blocks[-1][3]
    new_box_x1 = page_width * 0.95
    new_box_y1 = page_height * 0.95
    rect = fitz.Rect(new_box_x0, new_box_y0, new_box_x1, new_box_y1)
    # Вставка текста
    text = "End"
    text_size = round((new_box_y1 - new_box_y0) * 0.95, 0)
    rc = page.insert_textbox(rect,
                             text,
                             fontsize=text_size,
                             encoding=fitz.TEXT_ENCODING_CYRILLIC,
                             fontname="Times-Roman",
                             fontfile=None,
                             align=1)
    # сохраняем
    doc.save(output_file)

Кодировка, правда, не работает. Кириллица не поддерживается то ли шрифтом, то ли заданный параметр кодирования не отрабатывает. Разбираюсь еще с этим.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version