Как заблюрить текст в скриншоте документа
У меня есть папка с документами, которые имеют одинаковое оформление. Документы выглядят примерно так:
Документ №1
Условие
Вопрос
Решение
Мне необходимо сделать скриншот первой страницы в каждом документе, и заблюрить (размыть) текст "Решения".
- Каким образом это можно автоматизировать?
Я понимаю, что с помощью Python и библиотеки Spire.Doc я могу сделать скриншоты документов. И даже заблюрить текст с помощью библиотеки Pillow/ OpenCV возможно, но не понимаю как определить конкретные координаты, на которых нужно нарисовать прямоугольник с эффектом блюра. Если это вообще разумно или возможно.
Ответы (1 шт):
Может кому-то пригодится. Для начала прикладываю реализацию first page of .DOCX to PNG. Файлы написаны транслитом, потому что в проекте использую OpenCV, а он ругается на кириллицу.
Написал, как смог, прошу не ругаться - я совсем не программист.
import os
import docx2pdf
import pdf2image
# Создаем директорию для выходных PNG-файлов, если ее еще нет
if not os.path.exists('doc_to_png_output'):
os.makedirs('doc_to_png_output')
os.chdir('document_split_output')
# Получаем список всех файлов Word в текущей директории
word_files = [f for f in os.listdir('.') if f.startswith("Zadacha") and f.endswith(".docx")]
for word_file in word_files:
# Извлекаем номер задачи из имени файла
task_number = word_file[7:-5]
# Конвертируем Word в PDF
pdf_file = f"temp_{task_number}.pdf"
docx2pdf.convert(word_file, pdf_file)
# Конвертируем PDF в PNG
png_file = f"3. doc_to_png_output/Zadacha{task_number}.png"
images = pdf2image.convert_from_path(pdf_file, poppler_path='poppler-24.02.0\\Library\\bin')
os.chdir('..')
images[0].save(png_file, "PNG")
# Удаляем временный PDF-файл
os.chdir('document_split_output')
os.remove(pdf_file)
print(f'Zadacha{task_number}.png has been successfully saved')
И реализация blur image region. Полуавтоматическая работа, регион для блюра выбираю сам.
import os
# Функция для получения координат прямоугольной области из изображения
def get_roi(image):
height, width = image.shape[:2]
aspect_ratio = width / height
# Установите начальный размер окна с учетом соотношения сторон
window_width = 880
window_height = int(window_width / aspect_ratio)
cv2.namedWindow('Select ROI', cv2.WINDOW_NORMAL)
cv2.resizeWindow('Select ROI', window_width, window_height)
roi = cv2.selectROI('Select ROI', image)
cv2.destroyWindow('Select ROI')
return roi
# Функция для размытия выбранной области с помощью GaussianBlur
def blur_roi(image, roi):
x, y, w, h = roi
if w > 0 and h > 0:
roi_region = image[y:y + h, x:x + w]
blurred = cv2.GaussianBlur(roi_region, (51, 51), 0)
image[y:y + h, x:x + w] = blurred
return image
# Обработка всех PNG файлов в текущей директории
for filename in os.listdir('doc_to_png_output'):
if filename.endswith('.png'):
# Открытие изображения
image = cv2.imread(os.path.join('doc_to_png_output', filename))
# Отображение изображения и выбор области для размытия
clone = image.copy()
roi = get_roi(clone)
# Применение Гауссова размытия к выбранной области
blurred = blur_roi(image, roi)
# Сохранение обработанного изображения
output_filename = os.path.splitext(filename)[0] + '.png'
cv2.imwrite(os.path.join('blurred_images_output', output_filename), blurred)
# Закрытие окон с изображениями
cv2.destroyAllWindows()