• pdf生成:wkhtmltopdf


    wkhtmltopdf 是开源(LGPLv3)命令行工具,使用Qt WebKit渲染引擎将HTML渲染为PDF和各种图像格式。这些完全以“headless”模式运行,不需要显示或显示服务 wkhtmltoimage。

    建议:

    • 不要将wkhtmltopdf与任何不受信任的HTML一起使用  -  请确保对用户提供的HTML/JS进行清理,否则可能会完全接管其运行的服务器!请考虑使用强制访问控制系统,如AppArmor或SELinux, 请参阅 建议的 AppArmor 策略
    • 如果您正在使用它生成报告(即使用您控制的HTML),也可以考虑使用 WeasyPrint 商业工具Prince – 请注意 –请注意,我不属于这两个项目,请尽您的努力。
    • 如果您 使用它来 转换使用动态JS的网站,请考虑 使用 puppeteer  或它拥有的众多wrappers之一。
    pdfkit是python对wkhtmltopdf这个把网页转成pdf工具的一个封装, 必须得先安装一个wkhtmltopdf ( wkhtmltopdf ),根据自己的操作系统下载对应的版本即可。不要忘记它的安装目录。

    一、Ubuntu安装Python pdfkit:

    1、下载对应版本的wkhtmltopdf deb包 wkhtmltopdf
    查看系统版本
    2、sudo dpkg -i *.deb,如果报依赖错误执行下面语句再试sudo apt-get -f --fix-missing install
    3、使用 which wkhtmltopdf检查是否安装成功,输出结果为:/usr/local/bin/wkhtmltopdf
    4、安装pdfkit库 pip install pdfkit

    二、wkhtmltopdf参数

    1. General Options:
    2. --collate Collate when printing multiple copies 打印多份时进行校对
    3. --copies Number of copies to print into the pdf file (default 1) 要打印到pdf的副本数
    4. --extended-help Display more extensive help, detailing less common command switches
    5. -h, --help Display help
    6. -O, --orientation Set orientation to Landscape or Portrait 将方向设置为横向或纵向
    7. -s, --page-size Set paper size to: A4, Letter, etc. 将纸张大小设置为:A4、Letter等。
    8. --password HTTP Authentication password HTTP身份验证密码
    9. -p, --proxy Use a proxy 使用代理
    10. -q, --quiet Be less verbose
    11. --username HTTP Authentication username HTTP身份验证用户名
    12. -V, --version Output version information an exit 将版本信息输出到出口

    三、pdfkit使用

    给它一个url,它会自动获取url里的内容,帮你保存为pdf;给它一个html文件或者字符串,也可以保存为pdf文件。
    1. import pdfkit
    2. confg = pdfkit.configuration(wkhtmltopdf="/usr/local/bin/wkhtmltopdf")  # wkhtmltopdf的安装路径
    3. options = {
    4.     'page-size': 'A4',
    5.     'encoding':"UTF-8",
    6.     'enable-local-file-access': True  # 是否允许wkhtmltopdf访问本地资源,默认值为False。不加这行会报错 Exit with code 1 due to network error: ProtocolUnknownError
    7.     'margin-top':'0.75in',
    8.     'margin-right':'0.75in',
    9.     'margin-bottom':'0.75in',
    10.     'margin-left':'0.75in',
    11.     'no-outline':None,       # 为None时表示确定,则不生成目录
    12.     'header-line':None,      # 为None时表示确定,生成页眉下的线
    13.     'header-spacing':'3',    # 设置页眉与正文之间的距离,单位是毫米
    14.     'header-right':'Quality Report', # 设置页眉右侧数据
    15.   'header-font-size':10,   # 设置页眉字体大小
    16.     # 'header-html': HEADER_PATH,    # 设置页眉数据,作为页眉的html页面必须有
    17.     # 'footer-html': FOOTER_PATH,
    18.     'footer-font-size':10,   # 设置页脚字体大小
    19.     # 'allow': ACESS_PATH,
    20.     'animation':False,       # 导出PDF一定要设置,否则显示不全(关闭图表动画)
    21. }
    22. # 这个函数是从url里面获取内容, 这有3个参数,第一个是url或url列表,第二个是文件名,第三个就是khtmltopdf的路径, 返回值:成功返回True
    23. url_list = ["https://www.cnblogs.com/mianbaoshu/p/13366074.html", "https://www.bbsmax.com/A/KE5Qj4G4dL/"]
    24. pdfkit.from_url(url_list, 'url.pdf', options=options, configuration=confg)
    25. # from_file这个函数是从文件里面获取内容,这有3个参数,第一个是一个html文件或html文件列表,第二个是文生成的pdf的名字,第三个就是khtmltopdf的路径。可以使用参数cover来设置pdf封面
    26. pdfkit.from_file(['my.html', ], 'html.pdf', options=options, configuration=confg,cover='http://localhost:8080/static/data/pdfHeader.html')
    27. # from_string这个函数是从一个字符串里面获取内容,这有3个参数,第一个是一个字符串,第二个是文生成的pdf的名字,第三个就是khtmltopdf的路径
    28. html='''
    29.        
    30.            

      title

    31.            

      content

    32.        
      '''
  • pdfkit.from_string(html,'string.pdf', options=options, configuration=confg)
html中带css、png: 设置参数'enable-local-file-access': True
  1. import pdfkit
  2. file = "固件详情.html"
  3. confg = pdfkit.configuration(wkhtmltopdf="/usr/local/bin/wkhtmltopdf")
  4. wkhtmltopdf_options = {
  5.     'enable-local-file-access': True  # 是否允许wkhtmltopdf.exe访问本地资源,默认值为False。不加这行会报错 Exit with code 1 due to network error: ProtocolUnknownError
  6. }
  7. pdfkit.from_file(file, 'html.pdf', configuration=confg, options=wkhtmltopdf_options)

四、使用中的问题

4.1、IOError: wkhtmltopdf reported an error:Exit with code 1 due to network error: ContentNotFoundError

原因: 由于 html中含有相对路径的资源时 ,会保如上错误。
解决: 把html中的相对路径改成绝对路径就可以解决这个问题。

4.2、python 使用pdfkit生成pdf图表不显示

法1: 图表我用的百度的echarts,文档健全,配置灵活,可惜不支持3D图,如果有3D图的需求可以用highcharts
    html写的很顺利,图很快就出来了,可是当生成PDF的问题图表竟然显示不全
     最后发现是因为图片默认有个动画,而pdf生成的时候动画还未加载完成
    这个有 两种解决办法:
        1. 程序加延时
        2. 关闭图表动画
    我用的第二种方法,设置如下
     animation: false,   //导出PDF一定要设置,否则显示不全
法2: 因为加载的js什么的特别多 然后还要做一大堆的数据处理 所以页面要完全渲染完毕要非常久, 所以我运行时加了 --no-stop-slow-scripts 
法3: 百度了一天没结果。以为wkhtmltopdf不支持echarts,但是看到不少人能用,看来还是自己的问题 。 一开始怀疑wkhtmltopdf 不支持canvas,后来排除。
问题很简单:
1、echarts 写在jquery的onload里,jquery的$(function(){});方法没有执行,也没多研究,把echarts 放到页面最下方,去掉onload方法。
2 、显示echarts的div要设置一个高度和宽度,注意都要设置,浏览器不设置宽度能看到图,但是生成pdf不行。
3、加上参数 --javascript-delay 3000。
4、 echarts 设置 animation:false,如果延迟时间够长应该不设置也可以。

五、参考

wkhtmltopdf 
使用 wkhtmltopdf python html转pdf_mtl1994的博客-CSDN博客_python wkhtmltopdf
wkhtmltopdf转换html页面中包含的pdf文件无效显示空白-CSDN社区
python 使用pdfkit.from_url生成PDF时问题汇总 - 简书 (jianshu.com)
wkhtmltopdf生成pdf echarts 不显示_dadao2003的博客-CSDN博客

  • 相关阅读:
    ROS读书记录1:机器人SLAM导航核心技术与实战1
    YOLOV8目标检测——最全最完整模型训练过程记录
    Chrome插件精选 — 广告拦截插件
    trustZone学习
    第三讲 测量项目代码撰写1
    四元数插值
    方舟生存进化下载服务器文件及搜服方法
    Vue3+Typescript+Axios封装网络请求
    业务数据分析最佳案例!旅游业数据分析!⛵
    【乐吾乐3D可视化组态编辑器】3D场景与大屏通信
  • 原文地址:https://blog.csdn.net/leiwuhen92/article/details/128031446