当前位置:   article > 正文

【Python】Python将HTML转成图片、PDF_python html转图片

python html转图片

一、方法一——imgkit库

1、安装python的imgkit、pdfkit库

  1. pip install imgkit
  2. pip install pdfkit

2、下载wkhtmltopdf工具包

下载地址:https://wkhtmltopdf.org/downloads.html ,64位windows的话可以下载红框标出的版本

这个工具包有两个程序,分别用来转图片和pdf:

3、使用

1)转为pdf

API说明

我们常用PDFKit的三个API:

  • from_url:将远程URL页面导出为PDF。
  • from_file:将HTML文件导出为PDF。
  • from_string:将字符串导出为PDF。
  1. import pdfkit
  2. path_wkpdf = r'D:\DevelopSoftware\wkhtmltopdf\bin\wkhtmltopdf.exe' # 工具路径
  3. cfg = pdfkit.configuration(wkhtmltopdf=path_wkpdf)
  4. # 1、将html文件转为pdf
  5. pdfkit.from_file(r'./helloworld.html', 'helloworld.pdf', configuration=cfg)
  6. pdfkit.from_file([r'./helloworld.html', r'./111.html', r'./222.html'], 'helloworld.pdf', configuration=cfg) # 传入列表
  7. # 2、从url获取html,再转为pdf
  8. pdfkit.from_url('https://httpbin.org/ip', 'ip.pdf', configuration=cfg)
  9. pdfkit.from_url(['https://httpbin.org/ip','https://httpbin.org/ip'], 'ip.pdf', configuration=cfg) # 传入列表
  10. # 3、将字符串转为pdf
  11. pdfkit.from_string('Hello!','hello.pdf', configuration=cfg)

2)转为图片

  1. import imgkit
  2. path_wkimg = r'D:\DevelopSoftware\wkhtmltopdf\bin\wkhtmltoimage.exe' # 工具路径
  3. cfg = imgkit.config(wkhtmltoimage=path_wkimg)
  4. # 1、将html文件转为图片
  5. imgkit.from_file(r'./helloworld.html', 'helloworld.jpg', config=cfg)
  6. # 2、从url获取html,再转为图片
  7. imgkit.from_url('https://httpbin.org/ip', 'ip.jpg', config=cfg)
  8. # 3、将字符串转为图片
  9. imgkit.from_string('Hello!','hello.jpg', config=cfg)

3)补充options选项

评论区有大胸弟问中文字符串乱码的问题(参考:https://www.cnblogs.com/Neeo/articles/11566980.html):

一般情况下,html中的meta中表明编码格式charset时,程序就会自动按照charset编码进行转码。但如果未标明就会出现问题,因此可以通过在options参数中设置编码选项:

  1. options = {
  2. "encoding": "UTF-8", # 设置编码格式,这边utf8是个示例,具体用哪个编码还要看你的html文件用什么
  3. 'javascript-delay': '2000', # 设置等待javascript渲染时间
  4. "custom-header": [('Accept-Encoding', 'gzip')], # 下面的是设置图片的样式
  5. 'page-size': 'Letter',
  6. 'margin-top': '0.75in',
  7. 'margin-right': '0.75in',
  8. 'margin-bottom': '0.75in',
  9. 'margin-left': '0.75in',
  10. 'no-outline': False
  11. }

其他options可以参考:https://zhuanlan.zhihu.com/p/37096502

 编码问题实例:

  1. import imgkit
  2. path_wkimg = r'D:\DevelopSoftware\wkhtmltopdf\bin\wkhtmltoimage.exe' # 工具路径
  3. cfg = imgkit.config(wkhtmltoimage=path_wkimg)
  4. options = {
  5. "encoding": "UTF-8" # 这个具体要看你那个html页面到底是以什么编码格式保存的
  6. }
  7. imgkit.from_file(r'./helloworld.html', 'helloworld.jpg', options=options, config=cfg)

二、将html转为图片方法二——selenium

通过selenium模拟浏览器访问页面,再将页面保存为图片。

  1. from selenium import webdriver
  2. from selenium.common.exceptions import WebDriverException
  3. options = webdriver.ChromeOptions()
  4. #options.add_argument('--headless')
  5. options.add_argument('--disable-gpu')
  6. options.add_argument('--no-sandbox')
  7. options.add_argument('window-size=1920x1080')
  8. try:
  9. driver = webdriver.Chrome(options=options)
  10. driver.maximize_window()
  11. driver.get("https://www.baidu.com")
  12. driver.get_screenshot_as_file("baidu.png")
  13. driver.quit()
  14. except WebDriverException:
  15. print("截图失败")

不过上面这个只能截显示器显示部分的页面,如果要截整个网页,我在网上找到了一份代码:

  1. from selenium import webdriver
  2. import time
  3. import os.path
  4. import multiprocessing as mp
  5. def webshot(tup):
  6. print("当前进程%d已启动" %os.getpid())
  7. options = webdriver.ChromeOptions()
  8. options.add_argument('--headless') # 不知为啥只能在无头模式执行才能截全屏
  9. options.add_argument('--disable-gpu')
  10. driver = webdriver.Chrome(options=options)
  11. driver.maximize_window()
  12. # 返回网页的高度的js代码
  13. js_height = "return document.body.clientHeight"
  14. picname = str(tup[0])
  15. link = tup[1]
  16. print(link)
  17. try:
  18. driver.get(link)
  19. k = 1
  20. height = driver.execute_script(js_height)
  21. while True:
  22. if k * 500 < height:
  23. js_move = "window.scrollTo(0,{})".format(k * 500)
  24. print(js_move)
  25. driver.execute_script(js_move)
  26. time.sleep(0.2)
  27. height = driver.execute_script(js_height)
  28. k += 1
  29. else:
  30. break
  31. scroll_width = driver.execute_script('return document.body.parentNode.scrollWidth')
  32. scroll_height = driver.execute_script('return document.body.parentNode.scrollHeight')
  33. driver.set_window_size(scroll_width, scroll_height)
  34. driver.get_screenshot_as_file("D:/pics/" + picname)
  35. print("Process {} get one pic !!!".format(os.getpid()))
  36. driver.quit()
  37. except Exception as e:
  38. print(picname, e)
  39. if __name__ == '__main__':
  40. # 首先创建一个保存截图的文件夹
  41. filename = "D:/pics/"
  42. if not os.path.isdir(filename):
  43. # 判断文件夹是否存在,如果不存在就创建一个
  44. os.makedirs(filename)
  45. # 读取保存url的文件,返回一个列表
  46. # 列表中每个元素都是一个元组,文件保存url的格式是:保存为图片的名称, 网页地址。
  47. # 例:baidu.png,https://www.baidu.com
  48. # zhihu.png,https://www.zhihu.com
  49. with open('urls.txt', 'r') as f:
  50. lines = f.readlines()
  51. urls = []
  52. for line in lines:
  53. thelist = line.strip().split(",")
  54. if len(thelist) == 2 and thelist[0] and thelist[1]:
  55. urls.append((thelist[0], thelist[1]))
  56. # 创建进程池来多进程执行
  57. pool = mp.Pool()
  58. pool.map_async(func=webshot, iterable=urls)
  59. pool.close()
  60. pool.join()

ok,如果还有啥问题可以评论区问我,我看到会回复~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/204565
推荐阅读
相关标签
  

闽ICP备14008679号