我有以下用于打印到PDF的代码(它可以工作),我只使用谷歌Chrome进行打印
def send_devtools(driver, command, params=None):
# pylint: disable=protected-access
if params is None:
params = {}
resource = "/session/%s/chromium/send_command_and_get_result" % driver.session_id
url = driver.command_executor._url + resource
body = json.dumps({"cmd": command, "params": params})
resp = driver.command_executor._request("POST", url, body)
return resp.get("value")
def export_pdf(driver):
command = "Page.printToPDF"
params = {"format": "A4"}
result = send_devtools(driver, command, params)
data = result.get("data")
return data
正如我们所看到的,我正在使用Page.printToPDF
打印到base64,并在params
参数中传递“A4”作为format
不幸的是,这个参数似乎被忽略了。我看到一些代码使用了木偶演员使用它(A4格式),我认为这可以帮助我
即使有硬编码的宽度和高度(见下文),我也没有运气
"paperWidth": 8.27, # inches
"paperHeight": 11.69, # inches
使用上述代码,是否可以将页面设置为A4格式
2021年7月17日后更新
我决定使用Python包pdfminer.sixth验证我的原始代码的输出
当我将这些点的大小转换为英寸时,我感到震惊。尺寸是8.5 x 11,这不等于A4纸的尺寸8.27 x 11.69。当我看到这一点时,我决定通过查看chromium和selenium源代码来进一步探讨这个问题
在chromium源代码中,命令
Page.printToPDF
位于文件page_handler.cc此函数允许修改参数
paper_width
和paper_height
。这些参数取一个^ {CD4}},一个C++双是一个通用的数据类型,它在编译器内部用来定义和保存任何数值化的数据类型,尤其是任何十进制的值。C++双数据类型可以是分数,也可以是带有值的整数。p>这些参数具有默认值,这些值在Chrome DevTools Protocol中定义:
注意以下参数格式之间的差异
chromium
源代码和Chrome DevTools Protocol
详细信息chromium
源代码中Chrome DevTools Protocol
中的纸张宽度根据
chromium
源代码,使用SendCommandAndGetResultWithTimeout.
调用命令Page.printToPDF
在我最初的回答中,我使用了
send_command_and_get_result,
,这是 类似于命令SendCommandAndGetResultWithTimeout.
在查看了selenium源代码之后,不清楚如何正确地传递命令
send_command_and_get_result
或send_command_and_get_result_with_timeout.
我在
webdriver
{a3}源代码中注意到了这个函数:在做了一些研究和测试之后,我发现这个函数可以用来实现您的用例
输出以点为单位,需要转换为英寸
8.263332777783 x 11.679999445是A4纸张大小
最初发布于2021年7月13日
调用函数
Page.printToPDF.
时,可以传递多个parameters。其中两个参数是:下面的代码将这些参数传递给
Page.printToPDF.
相关问题 更多 >
编程相关推荐