python 使用pdfkit.from_url生成PDF时问题汇总

公司最近做项目,要求生成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!,报错信息如下所示:

报错1

看了半天也没有看懂,百度了也没有找到答案,急吼吼半天最后发现我把生成的文件out.pdf打开了,这样文件就被占用了,再想重新写入当然报错了,最后把文件关闭就好了
生成文件的时候一定要保证写入的文件未被占用

2.图表不显示问题
图表我用的百度的echarts,文档健全,配置灵活,可惜不支持3D图,如果有3D图的需求可以用highcharts
html写的很顺利,图很快就出来了,可是当生成PDF的问题图表竟然显示不全
最后发现是因为图片默认有个动画,而pdf生成的时候动画还未加载完成
这个有两种解决办法

  1. 程序加延时
  2. 关闭图表动画
    第一种发现是百度发现的,并没有实践验证过
    我用的第二种方法,设置如下
    animation: false,//导出PDF一定要设置,否则显示不全
  1. 集成到程序中,调用接口时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()
  1. html使用微软雅黑,设置font-weight:数值,在html看是没问题的,但是转成PDF之后不起作用,这个问题我还未找到解决办法

你可能感兴趣的:(python 使用pdfkit.from_url生成PDF时问题汇总)