Найти - Пользователи
Полная версия: [РЕШЕНО] Определить пустую часть страницы pdf файла и нарисовать символ
Начало » Python для новичков » [РЕШЕНО] Определить пустую часть страницы pdf файла и нарисовать символ
1
Ematten
Привет.

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

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

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

По принципу, все, конечно, зависит от библиотеки, но в первом приближении вижу такое исполнение: найти ширину строки в у.е. и кол-во строк. Умножив, получаю примерную (точную не нужно) заполненность страницы в у.е. и сравниваю с у.е. полностью заполненной страницы. Если разница получится больше или равна N+1 у.е., то рисую знак. Чем рисовать, пока не понял.
xam1816
приложите пример файла входящего, приложите пример файла который должен быть на выходе, т.е руками сделайте что-нужно.
Ematten
Прикрепил пример. Нужно найти расстояние А (между последней строкой и верхней границей нижнего колонтитула). Дальше беру, допустим, 90% этого расстояния и рисую по центру в пустом пространстве символ В высотой эти 90%.
xam1816
 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)
Ematten
Спасибо за пример, с определением пустого пространства я разобрался. Осталась вторая часть:

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

В вашем примере вы вставляете картинку, у которой заранее определены параметры. В моем случае мне нужно вставить символ средствами питона исходя из полученных от 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
Собственно, итоговый код такой:

 #!/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)

Кодировка, правда, не работает. Кириллица не поддерживается то ли шрифтом, то ли заданный параметр кодирования не отрабатывает. Разбираюсь еще с этим.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB