公司最近做项目,要求生成pdf报告,查了下感觉pdfkit不错,其实它就是html转换成PDF工具包wkhtmltopdf的Python封装版,具体的安装百度下就可以了
1.直接上代码生成pdf代码吧
options = {
'page-size': 'A4',
'margin-top': '0mm',
'margin-right': '0mm',
'margin-bottom': '0mm',
'margin-left': '0mm',
# 'orientation':'Landscape',#横向
'encoding': "UTF-8",
'no-outline': None,
# 'footer-right':'[page]' 设置页码
}
url=['https://www.baidu.com/']#url为需要导成pdf的html链接,换成自己的链接就可以了
pdfkit.from_url(url, 'mypdf/out.pdf', options=options, configuration=myconfig)
我单独建了一个topdf.py文件,然后直接运行python topdf.py
,完美运行
可是当我第二次运行的时候,竟然报错,oh my god!,报错信息如下所示:
看了半天也没有看懂,百度了也没有找到答案,急吼吼半天最后发现我把生成的文件out.pdf打开了,这样文件就被占用了,再想重新写入当然报错了,最后把文件关闭就好了
生成文件的时候一定要保证写入的文件未被占用
2.图表不显示问题
图表我用的百度的echarts,文档健全,配置灵活,可惜不支持3D图,如果有3D图的需求可以用highcharts
html写的很顺利,图很快就出来了,可是当生成PDF的问题图表竟然显示不全
最后发现是因为图片默认有个动画,而pdf生成的时候动画还未加载完成
这个有两种解决办法
- 程序加延时
- 关闭图表动画
第一种发现是百度发现的,并没有实践验证过
我用的第二种方法,设置如下
animation: false,//导出PDF一定要设置,否则显示不全
- 集成到程序中,调用接口时timeout或卡死
像1那样直接执行这段代码没有问题,使用接口调用的时候不行了
这个问题困扰了我好多天,世纪之难题也
最开始以为是nginx超时设置的问题,然后我直接用本地地址访问(127.0.0.0)发现还是不行,排除ng超时问题
然后又以为是flask超时问题,但是无论设置多大还是会timeout 3.
又开始怀疑header有问题,又设置了header,发现还是不行
百思不得其解
吃口冰棍冷静下
冷静下,果然又新思路
在接口中request请求html链接,看看是否能请求成功 ,代码如下:
from urllib import request
import socket
req = request.Request('http://www.douban.com/')
req = request.Request('http://127.0.0.1/xxx')
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.102 Safari/537.36 Vivaldi/1.93.955.38')
with request.urlopen(req) as f:
print('Status:', f.status, f.reason)
for k, v in f.getheaders():
print('%s: %s' % (k, v))
print('Data:', f.read().decode('utf-8'))
return 'sdata'
哇哈哈,还是timeout,排除了pdfkit问题,看来还是得在自身上找问题。
看来光冷静是没用的
最后发现是并发的问题,访问接口,中间代码又发送了请求,这个请求等接口的访问完了才能执行,然后就堵塞了,永远也出不来
so 需要改成异步非阻塞,用gevent 实现,gevent 深入的我还没有学习,欢迎大家交流讨论
from gevent import monkey
from gevent.pywsgi import WSGIServer
import time
# gevent的猴子魔法
monkey.patch_all()
http_server = WSGIServer(('127.0.0.1', port), app)
http_server.serve_forever()
- html使用微软雅黑,设置font-weight:数值,在html看是没问题的,但是转成PDF之后不起作用,这个问题我还未找到解决办法