[Python] How to Capture a Sequence of High-Quality PDF Frames from a Website (Without Screen...

Discussão em 'Python' iniciado por Stack, Março 9, 2025.

  1. Stack

    Stack Membro Participativo

    In Firefox, I can take very high-quality screenshots of a webpage by using Ctrl + P and saving the page as a PDF. This method preserves the text, images, and code in excellent resolution.

    Now, I have created a movable bar chart race in Flourish Studio and want to convert it into a high-quality video. However, I do not want to use screen recording tools.

    My Goal:
    I want to capture 30 high-resolution PDF frames from the website at different points in time (like a video sequence). Ideally, I need a tool or script that can automate the process of saving multiple PDFs from the website as it plays the animation.

    What I Tried:
    I attempted to write a Python script that:

    Opens the local HTML file of my Flourish chart in Firefox using Selenium.
    Waits for the page to load.
    Listens for the F1 key and triggers Ctrl + P to print the page as a PDF.
    However, the script does not save the PDF file in the output folder. I'm not sure why.

    Here is my code:

    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

    # Define paths
    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" # Save PDF location

    # Set up Firefox options
    options = Options()
    options.set_preference("print.always_print_silent", True) # Silent printing
    options.set_preference("print.show_print_progress", False) # Hide progress
    options.set_preference("print.print_to_file", True) # Print to file
    options.set_preference("print.save_print_settings", True) # Save settings
    options.set_preference("print.printer_PDF", "Save as PDF") # Set printer
    options.set_preference("print.print_to_file", True) # Enable saving print output to file
    options.set_preference("print.print_file_name", save_path) # Define the save location for PDF

    # Start WebDriver
    service = Service(executable_path=geckodriver_path)
    driver = webdriver.Firefox(service=service, options=options)

    # Open the HTML file
    driver.get("file:///" + html_file_path)

    # Wait for the page to load
    time.sleep(2)

    print("Press F1 to save as PDF.")

    # Listen for F1 key press
    while True:
    if keyboard.is_pressed('F1'):
    print("F1 pressed, saving as PDF...")

    # Trigger print command (Ctrl + P)
    body = driver.find_element(By.TAG_NAME, 'body')
    body.send_keys(Keys.CONTROL + 'p')

    # Wait for the print dialog to process
    time.sleep(2)

    print("PDF should be saved to:", save_path)
    break

    # Close browser
    driver.quit()


    My Questions:

    Why is my script not saving the PDF in the specified output folder?

    Is there a better way to automate capturing 30 sequential PDFs from the website at different animation frames?

    Is there any tool or script that can generate a sequence of PDFs (like 30 frames per second) from a webpage?

    Important:

    I do NOT want to use screen recording tools.

    I only need high-quality PDF frames that can later be converted into a video.

    Any help would be greatly appreciated!

    Continue reading...

Compartilhe esta Página