Selenium을 사용하여 PDF 인쇄 위치를 지정하려면 어떻게 하면 되나요?

1개월 전 질문 1개월 전 토론 73 views

어떤 작업을 하든 파일은 지정된 폴더가 아닌 다운로드(Windows 기본) 폴더에 계속 인쇄됩니다.

이유가 뭘까요?

   import os
   os.environ["PATH"] += os.pathsep + r'C:\Program Files (x86)\Chromedriver99';

   from selenium.webdriver.chrome.options import Options
   from selenium import webdriver

   options = Options()
    options.add_experimental_option(
        "prefs",
        {
            "download.prompt_for_download": False,
            "profile.default_content_setting_values.automatic_downloads": 1,
            "download.default_directory": r"C:\Users\Lucas\Downloads\ECV\\",
            "savefile.default_directory": r"C:\Users\Lucas\Downloads\ECV\\",
            "download.directory_upgrade": True,
            "safebrowsing.enabled": True # Some answers include this, makes no difference
        },
    )
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option("useAutomationExtension", False)

    # PDF printing settings
    print_settings = {
       "recentDestinations": [{
            "id": "Save as PDF",
            "origin": "local",
            "account": "",
        }],
        "selectedDestinationId": "Save as PDF",
        "version": 2,
        "isHeaderFooterEnabled": False,
        "isLandscapeEnabled": True
    }

    prefs = {'printing.print_preview_sticky_settings.appState': json.dumps(print_settings)}
    options.add_experimental_option('prefs', prefs)
    options.add_argument('--kiosk-printing') # Some answers include this, makes no difference


    driver = webdriver.Chrome(options=options)
    driver.get('https://stackoverflow.com/')
    driver.execute_script('window.print();')

python selenium

2022-05-15 21:52

3개의 해답

잠깐 찾아보니 download.default_directory가 아닌 savefile.default_directory 옵션이 사용되어야 한다고 합니다.


2022-05-15 21:53

두 가지 문제가 있네요.

첫 번째 문제는 prefs를 두 번 설정하는 것이구요.

add_experimental_option()이 옵션에 dictionary를 사용하고 있기 때문에 두 번째 설정은 첫 번째 설정보다 우선하며 실제로 모든 설정이 삭제됩니다.

self._experimental_options = {}


def add_experimental_option(self, name, value):
    """
    Adds an experimental option which is passed to chrome.

    Args:
      name: The experimental option name.
      value: The option value.
    """
    self._experimental_options[name] = value

두번째는 raw string r을 경로에서 쓰고 있는 겁니다.

C:\Users\Lucas\Downloads\ECV\\\\

이게 잘못된 것이구요.

\대신 /를 써야 합니다.

"C:/Users/Lucas/Downloads/ECV/"

또는 r 대신 \\를 쓰면 됩니다.

"C:\\Users\\Lucas\\Downloads\\ECV\\"

print_settings = {
    "recentDestinations": [{
        "id": "Save as PDF",
        "origin": "local",
        "account": "",
    }],
    "selectedDestinationId": "Save as PDF",
    "version": 2,
    "isHeaderFooterEnabled": False,
    "isLandscapeEnabled": True
}

prefs = {'printing.print_preview_sticky_settings.appState': json.dumps(print_settings),
         "download.prompt_for_download": False,
         "profile.default_content_setting_values.automatic_downloads": 1,
         "download.default_directory": "C:\\Users\\Lucas\\Downloads\\ECV\\",
         "savefile.default_directory": "C:\\Users\\Lucas\\Downloads\\ECV\\",
         "download.directory_upgrade": True,
         "safebrowsing.enabled": True}

options = Options()
options.add_experimental_option('prefs', prefs)
options.add_argument('--kiosk-printing')

driver = webdriver.Chrome(options=options)
driver.get('https://stackoverflow.com/')
driver.execute_script('window.print();')


2022-05-15 21:58

kiosk-printing 옵션을 쓰면 PDF 파일을 특정 디렉터리에 인쇄합니다.

import os
import json
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

download_directory = os.path.join(os.getcwd(), 'pdf_files')

options = Options()
options.add_argument('--kiosk-printing')
options.add_argument('--enable-print-browser')

options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)

# PDF printing settings
print_settings = {
    "recentDestinations": [{
        "id": "Save as PDF",
        "origin": "local",
        "account": "",
    }],
    "selectedDestinationId": "Save as PDF",
    "version": 2,
    "isHeaderFooterEnabled": False,
    "isCssBackgroundEnabled": True,
}

prefs = {
    'printing.print_preview_sticky_settings.appState': json.dumps(print_settings),
    'savefile.default_directory': download_directory
}

options.add_experimental_option('prefs', prefs)

driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver', options=options)
driver.get('https://stackoverflow.com/')
sleep(10)
driver.execute_script('window.print();')
sleep(10)
driver.close()
driver.quit()

 다른 방법도 있는데 selenium을 사용하여 특정 폴더로 페이지를 인쇄할 수 있는 방법입니다.

execute_cdp_cmd("Page.printToPDF")를 쓰는 방법입니다.

import os
import base64
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

download_directory = os.path.join(os.getcwd(), 'pdf_files')

chrome_options = Options()
chrome_options.add_argument("--start-maximized")
chrome_options.add_argument("--disable-infobars")
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--disable-popup-blocking")

# headless mode is required for this method of printing
chrome_options.add_argument("--headless")

# disable the banner "Chrome is being controlled by automated test software"
chrome_options.add_experimental_option("useAutomationExtension", False)
chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])

driver = webdriver.Chrome('/usr/local/bin/chromedriver', options=chrome_options)


driver.get('https://stackoverflow.com/')


# A4 print parameters
params = {'landscape': False,
          'paperWidth': 8.27,
          'paperHeight': 11.69,
          }


data = driver.execute_cdp_cmd("Page.printToPDF", params)
with open(f'{download_directory}/stackoverflow_website.pdf', 'wb') as file:
    file.write(base64.b64decode(data['data']))
    sleep(5)

driver.close()
driver.quit()


2022-05-15 22:01

해결방법이나 팁을 알고 계신다면


© 2022 pinfo. All rights reserved.