Selenium 4 + geckodriver:使用Page.printToPDF将html5网页打印为PDF.<



使用Selenium 4和chromedriver,我成功地将网站打印为具有自定义页面大小的PDF(参见下面的Python代码)。我想知道geckodriver/firefox的等效方法。

def send_devtools(driver, cmd, params={}):
resource = "/session/%s/chromium/send_command_and_get_result" % driver.session_id
url = driver.command_executor._url + resource
body = json.dumps({'cmd': cmd, 'params': params})
response = driver.command_executor._request('POST', url, body)
if (response.get('value') is not None):
return response.get('value')
else:
return None
def save_as_pdf(driver, path, options={}):
result = send_devtools(driver, "Page.printToPDF", options)
if (result is not None):
with open(path, 'wb') as file:
file.write(base64.b64decode(result['data']))
return True
else:
return False
options = webdriver.ChromeOptions()
# headless setting is mandatory, otherwise saving tp pdf won't work
options.add_argument("--headless")
driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver', options=options)
# chrome has to operate in headless mode to procuce PDF
driver.get(r'https://example.my')
send_devtools(driver, "Emulation.setEmulatedMedia", {'media': 'screen'})
pdf_options = { 'paperHeight': 92, 'paperWidth': 8, 'printBackground': True }
save_as_pdf(driver, 'myfilename.pdf', pdf_options)

你试过wkhtmltopdf了吗?

wkhtmltopdfwkhtmltoimage是开源(LGPLv3)命令行工具,使用Qt WebKit渲染引擎将HTML渲染成PDF和各种图像格式。它们完全"无头"运行。并且不需要显示或显示服务。

使用例子:

wkhtmltopdf http://google.com google.pdf

如果你想用python做,安装后你可以调用:

import os
number = iter(range(100))
def html_to_pdf(link, name="test"):
if os.path.isfile(name): # same file name
name = name[:-1] + str(next(number))
os.system(f"wkhtmltopdf {link} {name}.pdf")

另外,如果你想使用更多参数的wkhtmltopdf,你可以使用subprocess.run。您的html_to_pdf方法将获得更多的参数更有效。您可以使用:

签出文档
wkhtmltopdf -H

要将页面打印为PDF,有一个特定的WebDriver命令可以用于跨浏览器自动化。这意味着没有必要编写自定义代码,它利用了Chrome DevTools协议,就像上面为Chrome所做的那样。

对于Chrome和Firefox,这个命令已经在Selenium 3.141中可用,并且在Selenium 4中不需要修改也应该可以工作。

该命令将在响应的有效负载中返回base64编码的PDF数据,并且需要您自己将其保存到文件中。

Issue:

要使用Firefox或Geckodriver继续执行相同的任务,显然上面提到的用于写入文件的代码存在一些问题,导致无法保存目标文档。

解决方案:

所以我对代码进行了调整,现在在Firefox上使用Geckdriver打开了网站,并使用find_element_by_tag_name()函数对body元素进行了截图,随后将其转换为RGB模式,并将截图的尺寸保存为PDF文档,使用Pillow

代码:

from PIL import Image
from io import BytesIO
from selenium import webdriver
driverOptions = webdriver.FirefoxOptions()
# Uncomment the below line and change the path according to your configurations if you encounter an error like "Expected browser binary location ..."
# driverOptions.binary_location = '/Applications/Firefox.app/Contents/MacOS/firefox'
driverOptions.add_argument("--headless")
webDriver = webdriver.Firefox(executable_path = '/usr/local/bin/geckodriver', options = driverOptions)
webDriver.get(f'https://stackoverflow.com')
websiteScreenshot = Image.open(BytesIO(webDriver.find_element_by_tag_name('body').screenshot_as_png))
rgbImage = Image.new('RGB', websiteScreenshot.size, (255, 255, 255))
rgbImage.paste(websiteScreenshot, mask=websiteScreenshot.split()[3])
rgbImage.save('fileName.pdf', "PDF", resolution=100)
webDriver.quit()

引用:

  • 浏览器二进制位置问题
  • 将截图转换为PDF

附加:

你可以根据你的配置从这里下载Firefox的Geckodriver,编码愉快!😊

相关内容

  • 没有找到相关文章

最新更新