【问题标题】:Using Selenium and ChromeDriver, automatically scale the size of the page on print使用 Selenium 和 ChromeDriver,自动缩放打印页面的大小
【发布时间】:2020-03-15 12:31:33
【问题描述】:

我正在编写一个脚本来在 Chrome 中自动打印一组网页。如果我要手动打印它们,我会从“比例”下拉菜单中选择“自定义”,然后在下面的输入字段中输入 50。

当我使用 Selnium 和 ChromeDriver 自动批量打印这些页面时,我无法弄清楚要传递哪些参数来复制此设置。

appState = { "recentDestinations": [{
                "id": "Save as PDF",
                "origin": "local",
                "account": "",
                "printing.scaling": 'Custom', # <== Does it go here?
             }],
             "selectedDestinationId": "Save as PDF",
             "version": 2,
             "printing.scaling": 'Custom',  # <== Or here?
           }
profile = { 'printing.print_preview_sticky_settings.appState': json.dumps(appState),
            'printing.print_header_footer': False,

            # So many different versions of things I have tried :-(
            'printing.scaling': 'Custom',
            'printing.scaling_type': 'Custom',
            'print_preview.scaling': 'Custom',
            'print_preview.scaling_type': 'Custom',
            'printing.custom_scaling': True,
            'printing.fit_to_page_scaling': 50,
            'printing.page_scaling': True,
          }
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('prefs', profile)
br = webdriver.Chrome(options=chrome_options)

上面显示的所有不同选项都是在阅读大量 Chromium 源代码以获取提示后的猜测。

https://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/pref_names.cc?view=markup https://chromium.googlesource.com/chromium/src/+/master/printing/print_job_constants.cc https://chromium.googlesource.com/chromium/src/+/master/printing/print_job_constants.h

我没有线索了……有人有什么想法吗?谢谢!

【问题讨论】:

    标签: python selenium printing selenium-chromedriver chromium


    【解决方案1】:

    我知道这不能完全回答您的问题,但可能会解决您的问题。

    您是否尝试过不传递首选项,而只是缩小页面内容然后打印页面?

    driver.execute_script("document.body.style.zoom='50%'")
    # continue with printing
    

    对我来说,使用 Default 缩放选项进行缩小和打印的效果类似于将 Scale 设置为 50 的打印页面

    【讨论】:

    • 这是一个好主意,但不幸的是不适用于这些特定页面......他们有一堆由 D3 生成的 SVG 图表,缩放设置不能很好地配合它们.不过谢谢!
    【解决方案2】:

    我最终使用 Shadow Root 来更改比例。 这就是我所做的。

    driver1.switch_to.window(driver1.window_handles[-2])  # THIS IS THE PRINT DIALOG WINDOW - This could be -1 depending on how many windows are opened
    
    endTime = time.time() + 10
    while True:
        try:  # PRESS 'More settings' TO EXPAND
            expand = driver1.execute_script(
            "return document.querySelector('print-preview-app').shadowRoot.querySelector('print-preview-sidebar#sidebar').shadowRoot.querySelector('div#container').querySelector('print-preview-more-settings').shadowRoot.querySelector('div').querySelector('cr-expand-button')")
            if expand:
                expand.click()
                break
        except:
            pass
        time.sleep(.3)
        if time.time() > endTime:  # passed the waiting period
            driver1.switch_to.window(driver1.window_handles[0])
            break
    
    try:  # SELECT SCALE METHOD 'CUSTOM'
        scaling = Select(driver1.execute_script(
            "return document.querySelector('print-preview-app').shadowRoot.querySelector('#sidebar').shadowRoot.querySelector('#container').querySelector('#moreSettings').querySelector('print-preview-scaling-settings.settings-section').shadowRoot.querySelector('print-preview-settings-section').querySelector('div').querySelector('select.md-select')"))
        scaling.select_by_value('3')
    except:
        driver1.switch_to.window(driver1.window_handles[0])
    
    try:  # ENTER SCALE NUMBER
        time.sleep(.3)
        scaling_number = driver1.execute_script(
            "return document.querySelector('print-preview-app').shadowRoot.querySelector('#sidebar').shadowRoot.querySelector('#container').querySelector('#moreSettings').querySelector('print-preview-scaling-settings').shadowRoot.querySelector('iron-collapse').querySelector('print-preview-number-settings-section').shadowRoot.querySelector('print-preview-settings-section').querySelector('#controls').querySelector('span').querySelector('#userValue').shadowRoot.querySelector('#row-container').querySelector('#input-container').querySelector('div#inner-input-container').querySelector('#input')")
        scaling_number.clear()
        scaling_number.send_keys('50')
    except:
        driver1.switch_to.window(driver1.window_handles[0])
    
    driver1.switch_to.window(driver1.window_handles[0])  # back to main window
    

    【讨论】:

      【解决方案3】:

      经过多次搜索和反复试验,我终于找到了解决方案!该设置位于 appState 字典中,称为“scalingType”,但它是一个枚举,令人讨厌的是它似乎只接受一个数字,定义为here (Github mirror)here (googlesource)。 3 为您提供自定义缩放,然后您可以在“缩放”设置(这是一个字符串!)中定义它。所以我的设置现在看起来像:

      chrome_options = webdriver.ChromeOptions()
      appState = {"recentDestinations": [{"id": "Save as PDF", "origin": "local", "account": ""}],
                  "selectedDestinationId": "Save as PDF",
                  "version": 2,
                  "isHeaderFooterEnabled": False,
                  "isLandscapeEnabled": True,
                  "scalingType": 3,
                  "scaling": "141"}
      prefs = {'printing.print_preview_sticky_settings.appState': json.dumps(appState),
               'savefile.default_directory': BASE_DIR}
      chrome_options.add_experimental_option('prefs', prefs)
      chrome_options.add_argument('kiosk-printing')
      
      driver = webdriver.Chrome(f'{BASE_DIR}\\chromedriver.exe', options=chrome_options)
      

      缩放类型的当前选项是:

      • 0:默认
      • 1:适合页面
      • 2:适合纸张
      • 3:自定义

      但我在任何一个“适合”选项上都没有取得任何成功。

      更一般地说,这些设置/选项中的大多数可以通过查看铬源和/或其包含文件夹的this file 来确定。

      【讨论】:

      • 谢谢! scalingType 后面有一个错误的方括号。它不允许我只编辑它。
      猜你喜欢
      • 2013-02-08
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多