如何使用Selenium指定PDF打印的打印位置

3
无论我做什么,文件都会被打印到我的下载文件夹(Windows 默认文件夹)中,而不是指定的文件夹。我进行了研究,显然应该使用 savefile.default_directory 选项而不是 download.default_directory,但它并没有起作用。我尝试删除路径末尾的 \\,但没有成功。这是在工作电脑上,如果有任何区别,那就是一台运行 Windows 10 的机器。
   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();')
1个回答

1
您有两个问题,第一个是您设置了 prefs 两次,由于 add_experimental_option() 在选项中使用字典,因此第二次设置会覆盖第一次设置,并且所有这些设置实际上都被删除了。
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

第二个问题是在路径上使用原始字符串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();')

这个解决方案只会让打印弹出窗口出现,但实际上并没有将页面打印成PDF。 - LucasSeveryn
@LucasSeveryn,你尝试过两个路径了吗?C:/Users/Lucas/Downloads/ECV/C:\\Users\\Lucas\\Downloads\\ECV\\ - Guy
我尝试了 r"C:/Users/Lucas/Downloads/ECV/"C:\\Users\\Lucas\\Downloads\\ECV\\ 两种解决方案,但都在打印对话框中等待我的输入。 - LucasSeveryn
@LucasSeveryn 尝试使用 options.add_argument('--kiosk-printing'),我已经编辑了答案。 - Guy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接