как сохранить открытую страницу в формате PDF в Selenium (Python) - PullRequest
0 голосов
/ 05 июля 2019

Перепробовал все решения, которые я смог найти в Интернете, чтобы распечатать страницу, открытую в Selenium на Python. Однако, хотя всплывающее окно с печатью появляется, через секунду или две оно исчезает без сохранения PDF.

Вот код, который пробуют. На основе кода здесь - https://stackoverflow.com/a/43752129/3973491

Кодирование на Mac с Mojave 10.14.5.

from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import WebDriverException
import time
import json

options = Options()
appState = {
    "recentDestinations": [
        {
            "id": "Save as PDF",
            "origin": "local"
        }
    ],
    "selectedDestinationId": "Save as PDF",
    "version": 2
}

profile = {'printing.print_preview_sticky_settings.appState': json.dumps(appState)}
# profile = {'printing.print_preview_sticky_settings.appState':json.dumps(appState),'savefile.default_directory':downloadPath}
options.add_experimental_option('prefs', profile)
options.add_argument('--kiosk-printing')
CHROMEDRIVER_PATH = '/usr/local/bin/chromedriver'

driver = webdriver.Chrome(options=options, executable_path=CHROMEDRIVER_PATH)
driver.implicitly_wait(5)
driver.get(url)
driver.execute_script('window.print();')
$chromedriver --v
ChromeDriver 75.0.3770.90 (a6dcaf7e3ec6f70a194cc25e8149475c6590e025-refs/branch-heads/3770@{#1003})

Любые подсказки или решения относительно того, что можно сделать, чтобы распечатать открытую HTML-страницу в PDF. Потратили часы, пытаясь сделать эту работу. Спасибо!


Обновление на 2019-07-11:

Мой вопрос был идентифицирован как дубликат, но а) другой вопрос, похоже, использует код javascript, и б) ответ не решает проблему, поднятую в этом вопросе - это может быть связано с более свежим программным обеспечением версии. Используемая версия Chrome - версия 75.0.3770.100 (официальная сборка) (64-разрядная версия), а chromedriver - ChromeDriver 75.0.3770.90. На Mac OS Мохаве. Скрипт работает на Python 3.7.3.

Обновление на 2019-07-11:

Изменен код на

from selenium import webdriver
import json

chrome_options = webdriver.ChromeOptions()
settings = {
    "appState": {
        "recentDestinations": [{
            "id": "Save as PDF",
            "origin": "local",
            "account": "",
        }],
        "selectedDestinationId": "Save as PDF",
        "version": 2
    }
}
prefs = {'printing.print_preview_sticky_settings': json.dumps(settings)}
chrome_options.add_experimental_option('prefs', prefs)
chrome_options.add_argument('--kiosk-printing')
CHROMEDRIVER_PATH = '/usr/local/bin/chromedriver'
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=CHROMEDRIVER_PATH)
driver.get("https://google.com")
driver.execute_script('window.print();')
driver.quit()

А сейчас ничего не происходит. Chrome запускается, загружает URL-адрес, появляется диалоговое окно печати, но затем кажется, что ничего не происходит - ничего в очереди принтера по умолчанию, а также нет pdf - я даже искал файлы PDF, просматривая «Недавние файлы» на Mac.

Ответы [ 3 ]

1 голос
/ 18 июля 2019

Ответ здесь , работал, когда у меня не было других настроек принтера в моей ОС.Но когда у меня был другой принтер по умолчанию, это не сработало.

Я не понимаю, как, но кажется, что сделать небольшое изменение таким способом.

from selenium import webdriver
import json

chrome_options = webdriver.ChromeOptions()
settings = {
       "recentDestinations": [{
            "id": "Save as PDF",
            "origin": "local",
            "account": "",
        }],
        "selectedDestinationId": "Save as PDF",
        "version": 2
    }
prefs = {'printing.print_preview_sticky_settings.appState': json.dumps(settings)}
chrome_options.add_experimental_option('prefs', prefs)
chrome_options.add_argument('--kiosk-printing')
CHROMEDRIVER_PATH = '/usr/local/bin/chromedriver'
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=CHROMEDRIVER_PATH)
driver.get("https://google.com")
driver.execute_script('window.print();')
driver.quit()
1 голос

Решение не очень хорошее, но вы можете сделать снимок экрана и преобразовать его в pdf от Pillow ...

from selenium import webdriver
from io import BytesIO
from PIL import Image

driver = webdriver.Chrome(executable_path='path to your driver')
driver.get('your url here')
img = Image.open(BytesIO(driver.find_element_by_tag_name('body').screenshot_as_png))
img.save('filename.pdf', "PDF", quality=100)
1 голос
/ 05 июля 2019

Используйте pdfkit вместо:

import pdfkit

pdfkit.from_url('http://stackoverflow.com', 'page.pdf')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...