当前位置: 首页 > 知识库问答 >
问题:

Selenium 4+GeckoDriver:用page.printtopdf将网页打印成PDF格式

巫经义
2023-03-14

使用Selenium4和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)

共有1个答案

邵骁
2023-03-14

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

因此,我对代码进行了调整,现在使用Firefox上的Geckdriver打开网站,并使用函数find_element_by_tag_name()主体元素获取截图,该函数后来被转换为RGB模式,截图的维度随后使用Pillow保存为PDF文档

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
 类似资料:
  • 我有2个(或以上)海图,需要打印成PDF格式。我用PDf导出表单highchrt,它可以打印但只是打印1张图表。我的代码怎么了?或者有什么解决我问题的办法吗? 这是我的密码。 null null

  • 我正在学习Java,有一个非常简单的要求,我似乎不知道哪里出了问题。一个简单的ArrayList,用于写入控制台 名字 姓 多布 我似乎不知道我怎么能把它们打印在一行里 名字姓多布 另一个名字另一个姓氏另一个Dob 提前感谢你所有的帮助。

  • 我正在尝试使用HttpURLconnection类读取https://example.com/的内容。我已经移除了斜大括号之间的html标记,但是我在移除卷曲大括号之间的单词方面失败了。此外,字与字之间没有需要打印的空格。 如何去除卷边大括号之间的内容?以及如何在句子中的词与词之间放空格?

  • 我正在尝试打印剑道网格的所有页面我搜索了很多我使用了这个链接http://docs.telerik.com/KENDO-UI/controls/data-management/grid/walkthrough#printing 注意:链接名称仍然显示为链接,用户可以在打印页面中按它。 我试图使用这个代码来加载所有页面,但它是不工作的,因为它显示打印页面,然后加载网格与所有页面项 我想以友好的布局打

  • 使用飞碟以PDF格式打印图像。 超文本标记语言代码: 当我使用飞碟将HTML转换为PDF时。生成的PDF不会打印图像。 我需要使用任何特定的软件包来打印PDF格式的图像吗。如果你有任何问题,请告诉我。