Форум сайта python.su
Привет.
Прошу направить на нужный путь. Конкретного решения не требуется, требуется подсказать инструменты и принцип реализации.
Дано: скрипт, которому на вход будет дан pdf файл (обязательно созданный из офисного документа, то есть в pdf не изображения, а слой с текстом). Скрипт будет определять, на каких страницах отсутствует текст в количестве строк N+1 от конца последнего абзаца до нижнего колонтитула (его высота задана в скрипте). На месте этой пустой области скрипт будет рисовать какой-то символ.
Pdf файлы обрабатываю через PyPDF2. Вопрос с инструментом (готовой питоновской библиотекой, если такая есть) для обнаружение пустых мест между текстом и нижним колонтитулом. OpenCV? Что-то еще?
По принципу, все, конечно, зависит от библиотеки, но в первом приближении вижу такое исполнение: найти ширину строки в у.е. и кол-во строк. Умножив, получаю примерную (точную не нужно) заполненность страницы в у.е. и сравниваю с у.е. полностью заполненной страницы. Если разница получится больше или равна N+1 у.е., то рисую знак. Чем рисовать, пока не понял.
Отредактировано Ematten (Март 7, 2023 07:27:20)
Офлайн
приложите пример файла входящего, приложите пример файла который должен быть на выходе, т.е руками сделайте что-нужно.
Офлайн
Прикрепил пример. Нужно найти расстояние А (между последней строкой и верхней границей нижнего колонтитула). Дальше беру, допустим, 90% этого расстояния и рисую по центру в пустом пространстве символ В высотой эти 90%.
Прикреплённый файлы:
пример.jpg (351,3 KБ)
Офлайн
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)
Офлайн
Спасибо за пример, с определением пустого пространства я разобрался. Осталась вторая часть:
На месте этой пустой области скрипт будет рисовать какой-то символ.
rect = fitz.Rect(x, y, x + w, y + h)
rc = page.insert_textbox(rect, text, fontsize = 48, fontname = "Times-Roman", fontfile = None, align = 1)
Отредактировано Ematten (Март 7, 2023 07:36:19)
Офлайн
Собственно, итоговый код такой:
#!/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)
Офлайн