Как захватить последовательность высококачественных PDF-кадров с веб-сайта (без записи экрана)?

Вопрос или проблема

В Firefox я могу делать скриншоты веб-страницы очень высокого качества, используя Ctrl + P и сохраняя страницу в виде PDF. Этот метод сохраняет текст, изображения и код в отличном разрешении.

Теперь я создал подвижную диаграмму в Flourish Studio и хочу преобразовать её в высококачественное видео. Однако я не хочу использовать инструменты записи экрана.

Моя цель:
Я хочу захватить 30 высококачественных кадров в формате PDF с веб-сайта в разные моменты времени (как в видео). В идеале, мне нужен инструмент или скрипт, который может автоматизировать процесс сохранения нескольких PDF с веб-сайта по мере воспроизведения анимации.

Что я пробовал:
Я попытался написать скрипт на Python, который:

Открывает локальный HTML файл моей диаграммы Flourish в Firefox, используя Selenium.
Ждёт, пока загрузится страница.
Слушает нажатие клавиши F1 и вызывает Ctrl + P для печати страницы в PDF.
Однако скрипт не сохраняет PDF файл в выходной папке. Я не уверен, почему.

Вот мой код:

import time
import keyboard
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options

# Определение путей
html_file_path = r"E:\Desktop\New folder (4)\20250309101616805.html"
geckodriver_path = r"E:\Desktop\New folder (4)\geckodriver.exe"
save_path = r"E:\Desktop\New folder (4)\New folder\output.pdf"  # Место сохранения PDF

# Настройка параметров Firefox
options = Options()
options.set_preference("print.always_print_silent", True)  # Тихая печать
options.set_preference("print.show_print_progress", False)  # Скрыть прогресс
options.set_preference("print.print_to_file", True)  # Печать в файл
options.set_preference("print.save_print_settings", True)  # Сохранять настройки
options.set_preference("print.printer_PDF", "Save as PDF")  # Установить принтер
options.set_preference("print.print_to_file", True)  # Разрешить сохранение вывода печати в файл
options.set_preference("print.print_file_name", save_path)  # Определить место сохранения PDF

# Запуск WebDriver
service = Service(executable_path=geckodriver_path)
driver = webdriver.Firefox(service=service, options=options)

# Открыть HTML файл
driver.get("file:///" + html_file_path)

# Дождаться загрузки страницы
time.sleep(2)

print("Нажмите F1 для сохранения как PDF.")

# Ожидание нажатия клавиши F1
while True:
    if keyboard.is_pressed('F1'):
        print("F1 нажата, сохраняем как PDF...")

        # Вызвать команду печати (Ctrl + P)
        body = driver.find_element(By.TAG_NAME, 'body')
        body.send_keys(Keys.CONTROL + 'p')

        # Подождать, пока диалог печати обработается
        time.sleep(2)

        print("PDF должен быть сохранён в:", save_path)
        break

# Закрыть браузер
driver.quit()

Мои вопросы:

Почему мой скрипт не сохраняет PDF в указанной выходной папке?

Есть ли лучший способ автоматизировать захват 30 последовательных PDF с веб-сайта на разных кадрах анимации?

Существует ли инструмент или скрипт, который может генерировать последовательность PDF (например, 30 кадров в секунду) с веб-страницы?

Важно:

Я НЕ хочу использовать инструменты записи экрана.

Мне нужны исключительно высококачественные кадры в формате PDF, которые затем можно будет конвертировать в видео.

Любая помощь будет очень полезна!

Ответ или решение

Вопрос о том, как извлечь последовательность качественных PDF кадров с веб-сайта без использования экранных записей, является частым среди специалистов, стремящихся сохранить высокое разрешение текстов, изображений и других составляющих веб-контента. В данном случае пользователь хочет автоматизировать процесс сохранения нескольких PDF файлов из анимированного графика на платформе Flourish Studio. Решение этой задачи требует как теоретического подхода, так и практической реализации.

Теория

При печати веб-страницы в PDF файле используются внутренние механизмы браузера для рендеринга содержимого страницы. Поскольку анимации подразумевают динамическое обновление страницы, задача сводится к тому, чтобы «заморозить» каждое необходимое состояние страницы и сохранить его в виде PDF.

По умолчанию, Selenium и другие аналогичные инструменты предназначены для автоматизации браузера и не предоставляют встроенных методов для прямого сохранения страниц в PDF. Следовательно, необходимо использовать возможности браузера для печати, создавая высококачественные PDF версии анимационного контента. Это может также включать управление диалоговыми окнами системы и принтера, что часто представляет собой сложность.

Пример

Давайте разберём пример на Python с использованием Selenium и возможностями Firefox. Основная цель: улучшить существующий код, чтобы устранить проблемы с сохранением файлов и сохранить анимацию с нескольких кадров:

import time
import os
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.keys import Keys

# Пути к необходимым файлам и драйверам
html_file_path = r"E:\Desktop\New folder (4)\20250309101616805.html"
geckodriver_path = r"E:\Desktop\New folder (4)\geckodriver.exe"
output_directory = r"E:\Desktop\New folder (4)\New folder"

# Настройка опций Firefox
options = Options()
options.add_argument("--kiosk-printing")  # Печать без подтверждения диалогового окна
options.set_preference("print.save_print_settings", True)
options.set_preference("print.printer_MyPDFPrinter.print_command", "lp -d MyPDFPRinter ${MOZ_PRINTER} ${OUTPUT_FILE}")

# Запуск WebDriver
service = Service(executable_path=geckodriver_path)
driver = webdriver.Firefox(service=service, options=options)

# Открытие HTML файла
driver.get("file:///" + html_file_path)

# Ожидание загрузки страницы
time.sleep(5)

# Автоматизация процесса сохранения 30 кадров
for i in range(30):
    # Задание имени файла для каждого кадра
    pdf_file_path = os.path.join(output_directory, f"frame_{i+1:02}.pdf")
    options.set_preference("print.print_to_file", True)
    options.set_preference("print.print_to_filename", pdf_file_path)

    # Инициация процесса печати
    body = driver.find_element_by_tag_name('body')
    body.send_keys(Keys.CONTROL, 'p')
    time.sleep(2)  # Задержка для выполнения всех операций печати

    # Пауза между кадрами анимации
    time.sleep(1)  # или как минимум необходимое время для переключения кадров

# Закрытие браузера
driver.quit()

Применение

  1. Установка и настройка: Убедитесь, что все пути к файлам и драйверам указаны корректно. Прежде чем запустить скрипт, проверьте, что драйвер Firefox, используемый с Selenium, совместим с вашей текущей версией браузера.

  2. Автоматизация и управление диалогами печати: В данном примере ключевым шагом является конфигурирование автоматической печати через Firefox. Опция --kiosk-printing позволяет обойти стандартные диалоги подтверждения, непосредственно сохраняя PDF в указанный каталог.

  3. Последовательность кадров: Итерационный цикл в коде предусматривает создание 30 последовательных PDF файлов, имитируя процесс перехода между ключевыми кадрами анимации. Межкадровая пауза гарантирует достаточное время на переход анимации в следующее состояние.

Эти действия позволят достичь цели – получить серию PDF файлов, представляющих собой анимационные кадры графика без использования методов экранной записи. Следующий шаг – преобразование этих файлов в видеоформат с помощью инструментов вроде FFMPEG, что возможно обсуждать отдельно.

Оцените материал
Добавить комментарий

Капча загружается...