Вопрос или проблема
В 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()
Применение
-
Установка и настройка: Убедитесь, что все пути к файлам и драйверам указаны корректно. Прежде чем запустить скрипт, проверьте, что драйвер Firefox, используемый с Selenium, совместим с вашей текущей версией браузера.
-
Автоматизация и управление диалогами печати: В данном примере ключевым шагом является конфигурирование автоматической печати через Firefox. Опция
--kiosk-printing
позволяет обойти стандартные диалоги подтверждения, непосредственно сохраняя PDF в указанный каталог. -
Последовательность кадров: Итерационный цикл в коде предусматривает создание 30 последовательных PDF файлов, имитируя процесс перехода между ключевыми кадрами анимации. Межкадровая пауза гарантирует достаточное время на переход анимации в следующее состояние.
Эти действия позволят достичь цели – получить серию PDF файлов, представляющих собой анимационные кадры графика без использования методов экранной записи. Следующий шаг – преобразование этих файлов в видеоформат с помощью инструментов вроде FFMPEG, что возможно обсуждать отдельно.