pdf生成:wkhtmltopdf

news2025/8/9 17:10:24
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参数

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

三、pdfkit使用

给它一个url,它会自动获取url里的内容,帮你保存为pdf;给它一个html文件或者字符串,也可以保存为pdf文件。
import pdfkit

confg = pdfkit.configuration(wkhtmltopdf="/usr/local/bin/wkhtmltopdf")  # wkhtmltopdf的安装路径
options = {
    'page-size': 'A4',
    'encoding':"UTF-8",
    'enable-local-file-access': True  # 是否允许wkhtmltopdf访问本地资源,默认值为False。不加这行会报错 Exit with code 1 due to network error: ProtocolUnknownError
    'margin-top':'0.75in',
    'margin-right':'0.75in',
    'margin-bottom':'0.75in',
    'margin-left':'0.75in',
    'no-outline':None,       # 为None时表示确定,则不生成目录
    'header-line':None,      # 为None时表示确定,生成页眉下的线
    'header-spacing':'3',    # 设置页眉与正文之间的距离,单位是毫米
    'header-right':'Quality Report', # 设置页眉右侧数据
  'header-font-size':10,   # 设置页眉字体大小
    # 'header-html': HEADER_PATH,    # 设置页眉数据,作为页眉的html页面必须有<!DOCTYPE html>
    # 'footer-html': FOOTER_PATH,
    'footer-font-size':10,   # 设置页脚字体大小
    # 'allow': ACESS_PATH,
    'animation':False,       # 导出PDF一定要设置,否则显示不全(关闭图表动画)
}

# 这个函数是从url里面获取内容, 这有3个参数,第一个是url或url列表,第二个是文件名,第三个就是khtmltopdf的路径, 返回值:成功返回True
url_list = ["https://www.cnblogs.com/mianbaoshu/p/13366074.html", "https://www.bbsmax.com/A/KE5Qj4G4dL/"]
pdfkit.from_url(url_list, 'url.pdf', options=options, configuration=confg)

# from_file这个函数是从文件里面获取内容,这有3个参数,第一个是一个html文件或html文件列表,第二个是文生成的pdf的名字,第三个就是khtmltopdf的路径。可以使用参数cover来设置pdf封面
pdfkit.from_file(['my.html', ], 'html.pdf', options=options, configuration=confg,cover='http://localhost:8080/static/data/pdfHeader.html')

# from_string这个函数是从一个字符串里面获取内容,这有3个参数,第一个是一个字符串,第二个是文生成的pdf的名字,第三个就是khtmltopdf的路径
html='''
        <div>
            <h1>title</h1>
            <p>content</p>
        </div>'''
pdfkit.from_string(html,'string.pdf', options=options, configuration=confg)
html中带css、png: 设置参数'enable-local-file-access': True
import pdfkit

file = "固件详情.html"

confg = pdfkit.configuration(wkhtmltopdf="/usr/local/bin/wkhtmltopdf")
wkhtmltopdf_options = {
    'enable-local-file-access': True  # 是否允许wkhtmltopdf.exe访问本地资源,默认值为False。不加这行会报错 Exit with code 1 due to network error: ProtocolUnknownError
}
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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sqli-labs/Less-61

这一关的欢迎界面提示我们尝试机会为5次 然后要以id为注入点 首先先判断一下是否为数字型 输入id1 and 12 回显如下 所以属于字符型 然后输入1 回显如下 出现了报错信息 说明可以进行报错注入 也说明了注入类型 佐证一下 输入一个1))--回显如下 这道题我还是使用报错注入 首…

使用Python查询国内 COVID-19 疫情

有时我们只是想要一个速的工具来告诉当前疫情的情况&#xff0c;我们只需要最少的数据。 使用Python语言和tkinter图形化显示数据。 首先&#xff0c;我们使用 Tkinter 库使我们的脚本可以图形化显示。 使用 requests 库从 丁香园 获取数据。 然后我们将在这种情况下显示我们…

c# .net+香橙派orangepi 200块多打造自家 浇花助手 系统

由于出差多&#xff0c;这里的花经常过一段时间才能浇水,有些花都旱晕了&#xff0c;所以想做一个助手帮我远程就可以操作浇花&#xff0c;当然也完全可以发展为一个商用系统&#xff0c;拿浇花来做为一个测试平台吧&#xff0c;现在已经完成了&#xff0c;并已经运行了一个多月…

异双功能连接体:Alkyne PEG4 APN,2183440-36-8

一、产品描述&#xff1a; APN-C3-PEG4-炔是一种含有APN部分的异双功能连接体&#xff0c;对半胱氨酸和炔基具有很强的化学选择性。APN半胱氨酸缀合物在水性介质、人血浆和活细胞中的优异稳定性使这种新的巯基点击反应成为生物缀合应用的一种有前景的方法。 APN-C3-PEG4 alkyne…

C语言:关键字----switch、case、default(开关语句)

C语言&#xff1a;基础开发----目录 C语言&#xff1a;关键字—32个(分类说明) 有32个关键字详细说明&#xff0c;还有跳转链接&#xff01; 一、开关语句----介绍 开关语句&#xff0c;包括以下四种关键字&#xff1a; switch&#xff1a;开关语句case&#xff1a; 开关语句…

PHP如何实现订单的延时处理详解

业务需求 订单是我们在日常开发中经常会遇到的一个功能&#xff0c;最近在做业务的时候需要实现客户下单之后订单超时未支付自动取消的功能&#xff0c;刚开始确认了几种方法&#xff1a; 客户端到时间请求取消服务端定时查询有没有需要取消的订单&#xff0c;然后批量处理下…

深度学习入门(五十)计算机视觉——转置卷积

深度学习入门&#xff08;五十&#xff09;计算机视觉——转置卷积前言计算机视觉——转置卷积课件&#xff08;初见转置卷积&#xff09;1 转置卷积2 为什么称之为“转置”课件&#xff08;再谈转置卷积&#xff09;1 转置卷积2 重新排列输入和核形状换算同反卷积的关系总结教…

Android -- 每日一问:Activity的启动模式(launchMode)有哪些,有什么区别?

经典回答 这应该是一道很虐人的面试题&#xff0c;很多人都答不上来&#xff0c;很多人根本就没有用过。当我发现在被我面试的人中有80%的比例对它不了解时&#xff0c;我找过一些同事讨论是否还有在面试中考查这个问题的必要&#xff0c;得到的回答是“程序员何苦为难程序员”…

网络面试题总结

IO协议 问题一:如何理解IP的不可靠和无连接 不可靠:指的是不能保证数据包能成功地到达目的地。发生错误的时候,丢弃该数据包,发送ICMP消息给信源端。可靠性由上层提供。无连接: :IP 不维护关于后续数据报的状态信息。 体现在,IP 数据可以不按顺序发送和接收。A 发送连续…

信息安全工程实践笔记--Day2 暴力破解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录实验目标一、弱口令分类1.系统服务弱口令2.设备弱口令3.社工型的弱口令二、弱口令的攻击方式暴力破解获取密码的方式三、bp实操1.bp模块讲解1.sniper&#xff08;狙击…

跨平台下移动应用的开发框架对比与分析

当前由于移动互联网技术的日益发展&#xff0c;人们对移动互联网程序的要求也是越来越高&#xff0c;以往的互联网程序已经不能满足人们日益增长的需求&#xff0c;对此相关的工作技术人员要不断努力&#xff0c;研发出与时俱进的移动互联网程序。 近些年来由于平板电脑、智能…

【HTML5】调查问卷制作简约版

当你第一次使用CSS时候 目录 1、调查问卷网页展示及源码 1.1html源码 1.2css源码 2、form表单属性的用法 2.1date属性 2.2radio属性 2.3checkbox属性 2.4textarea标签 2.5required属性 2.6button标签 前言&#xff1a; 大家好&#xff0c;我是拳击哥带你捶键盘。首先感…

是前端受欢迎,不是你学了前端你就受欢迎好吧

☆ 这几天世界杯真是爆冷啊&#xff0c;也许是这届世界杯是冬天举办的原因吧。 ☆ 昨晚的德国对日本&#xff0c;日本做为亚洲小组冲出的第一名&#xff0c;实力强没有问题。而且我从小就看《足球小子》&#xff0c;大空翼深入人心啊。还记得那个动画片&#xff0c;放了学赶紧回…

运营版uniapp多商户商城小程序+H5+APP+商家入驻短视频社区种草直播阶梯拼团

运营版uniapp多商户商城小程序H5APP商家入驻短视频社区种草直播阶梯拼团 前后端全套源码&#xff0c; 支持二次开发&#xff0c;代码无加密&#xff01; 独立商家后台 用于店铺商品管理订单管理发货管理等 多类经营模式 多商家B2B2C、自营B2C运营模式 私有化部署 前端Uni…

Unity编辑器拓展最全实现

1编辑器顶部菜单学习 验证事项 2编辑器Scene菜单学习 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;public class TestSceneMenu : MonoBehaviour { [InitializeOnLoadMethod] //加入这个属性&#xff0c;就相当于…

7.前端笔记-CSS-元素显示模式

HTML元素分为块元素和行内元素两种类型 1、块元素 常见的块元素&#xff1a; <h1>~<h6> <p> <div> <ul> <ol> <li>块元素的特点&#xff1a; &#xff08;1&#xff09;独占一行 &#xff08;2&#xff09;高度、宽度、内外边距可…

java线程池详解

一 介绍 线程我们可以使用 new 的方式去创建&#xff0c;但如果并发的线程很多&#xff0c;每个线程执行的时间又不长&#xff0c;这样频繁的创建线程会大大的降低系统处理的效率&#xff0c;因为创建和销毁进程都需要消耗资源&#xff0c;线程池就是用来解决类似问题。 线程…

餐饮+KTV融合消费模式,会受消费者喜欢吗?

这个五一&#xff0c;我们雨科网门店系统的客户&#xff0c;大侠火锅店终于是将KTV搬到了自己的门店里&#xff0c;运用门店小程序功能及纸质代金券及礼品的噱头吸引客户进店&#xff0c;只需消费并和任意一人合唱一首歌即可领取&#xff0c;消费者在等餐或放松的时候一键点歌演…

一起来了解下 TOWER “未知装置”

从 2022 年 11 月 9 日开始&#xff0c;TOWER 未知装置可在 TOWER Token 网站&#xff08;https://www.crazydefenseheroes.com/fusion/game-assets&#xff09;上使用&#xff0c;允许玩家使用 TOWER Token 融合他们的 NFT 或将他们现有的 TOWER NFT 跟踪为不同的形式。 第一阶…

js - js中关于getBoundingClientRect()方法的使用

介绍一下getBoundingClientRect()方法的一些属性&#xff0c;以及具体的使用场景和一些需要注意的问题&#xff1b; 1&#xff0c;介绍 此方法返回元素的大小及其相对于视口的位置&#xff1b;返回的是一个对象&#xff1a; 包括 left、top、right、bottom、x、y、width 和 he…