Html页面转化为PDF文件

2021-07-16 14:52:37

请用微信扫描二维码

请用微信扫码分享

❤️

方法一 pdfkit

用到的库 参考:http://kaito-kidd.com/2015/03/12/python-html2pdf/ import pdfkit

语法:

pdfkit.url('http://www.baidu.com', 'path/out.pdf')  # 参数1 页面地址, 参数2,要导出的文件路径

pdfkit.html('path/test.html', 'out.pdf')   # 参数1 页面文件路径, 参数2, 要导出的文件路径

pdfkit.string('hello!', 'out.pdf') .  # 参数1 字符串(可以是页面渲染后的字符串),参数2, 要导出的文件路径

核心代码

html = render_template('path.html', items=items,
                       license=license, spec_name=spec_name, th_mils=th_mils,
                       part=part, car_book_list=car_book_list)
一些API
# 导出的PDF页面参数的设置
options = {
    'page-size': 'Letter',
    'margin-top': '0.25in',
    'margin-right': '0.2in',
    'margin-bottom': '0.25in',
    'margin-left': '0.2in'
}

# 页面用到的css文件
css = [current_app.root_path + url_for('static', filename='path.css'),
       current_app.root_path + url_for('static', filename='path.js'),
       current_app.root_path + url_for('static', filename='path.js')]

filename = get_filename(r'maintenance.pdf')
pdfkit.from_string(html, filename, css=css, options=options)
filepath = os.getcwd() + '/' + filename
file_url = fill_domain_to_img(upload_file(filename, filepath))

os.remove(filename)

难点: 1、页面渲染, 2、页面样式不兼容, 3、七牛云工具包的使用。

wdnmd 不建议在生产环境中使用,很坑,会出现中文乱码

以上全不行

方法二 xhtml2pdf

官方文档:https://xhtml2pdf.readthedocs.io/en/latest/

语法:

from xhtml2pdf import pisa

# Define your data
sourceHtml = "<html><body><p>To PDF or not to PDF</p></body></html>"
outputFilename = "test.pdf"

# Utility function
def convertHtmlToPdf(sourceHtml, outputFilename):
    # open output file for writing (truncated binary)
    resultFile = open(outputFilename, "w+b")

    # convert HTML to PDF
    pisaStatus = pisa.CreatePDF(
            sourceHtml,                # the HTML to convert
            dest=resultFile)           # file handle to recieve result

    # close output file
    resultFile.close()                 # close output file

    # return True on success and False on errors
    return pisaStatus.err


# Main program
if __name__ == "__main__":
    pisa.showLogging()
    convertHtmlToPdf(sourceHtml, outputFilename)

也可以不再本地生成PDF文件,直接在浏览器生成,可下载或预览

渲染页面 flask+jinja2

这里用到的是flask框架

html = render_template('path/detail.html', item=item, # 页面要渲染的数据
                       font_path=current_app.root_path + url_for('static', filename='fonts/msyh.ttf'),  # 因为是PDF文件的中文编码问题,所以要指定兼容中文的字体文件
                       logo=current_app.root_path + url_for('static', filename='assets/images/logo/dianyi_logo.jpg'))  # 静态文件都要用这种方式传过去

因为css,和js 在生成的PDF文件里样式并不一定生效,所以干脆不传样式文件了。(所以只能生成一下简单一点的PDF文件了)

filename = utils.get_filename('report.pdf') # 生成一个随机的文件名 get_filename() 返回的是时间戳+随机数.pdf
result = BytesIO() # 打开字节流

# 生成pdf
pdf = pisa.CreatePDF(BytesIO(html.encode('utf-8')), result, encoding='utf-8')  # 生成PDF文件
resp = make_response(result.getvalue())  # 生成http-Response 响应的就是PDF文件的值
result.close()
resp.headers["Content-Disposition"] = ("inline; filename='{0}'".format(filename))  # inline 是在浏览器预览,attachment 是直接下载
resp.headers['Content-Type'] = 'application/pdf'
resp.headers['verify'] = 'false'
return resp