导出pdf的需求,可以说不难实现,但根据项目要求,页面上存在js渲染的表格,直接用wkhtmltopdf没办法生成,只好先将图片的url(var dataURL = canvas.toDataURL())传到后端,保存到json文件中,在下载的时候直接将json文件解析到页面中,进行pdf下载操作
在图片写入到json文件中后,点击下载一直无法生成图片,查找资料发现如果谷歌浏览器直接访问dataURL,能打开图片,但是访问之后没有图片显示,发现是因为js加载的问题,还没加载完,就传值了,所以用了setTimeout,延迟执行ajax传值,等js加载图表完成后再执行
1.reportlab
pip安装reportlab,需要自己排版,重新绘制表格
from reportlab.pdfgen import canvas
def download(request, report_id):
# 将文本导出为pdf
retReport = getReport(report_id)
template = get_template('123.html')
html = template.render({'retReport': retReport})
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename=test.pdf'
p = canvas.Canvas(response)
# 其实pdf生成的是页面标签字符串
p.drawString(100, 100, html)
p.showPage()
p.save()
return response
# 将图片导出为pdf
# dataURL = request.POST.get('dataURL')
# imagedata = base64.b64decode(dataURL)
# response = HttpResponse(content_type='application/pdf')
# response['Content-Disposition'] = 'attachment; filename=test.pdf'
# p = canvas.Canvas(response)
# p.drawImage(dataURL, 0, 0)
# p.showPage()
# p.save()
# return response
2.wkhtmltopdf
需要安装wkhtmltopdf.exe,pip安装pdkit
只能导出html,css不会去执行js文件
from pdfkit import pdfkit
def download(request, report_id):
#需要配置安装路径
path_wkhtmltopdf = 'D:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe'
config = pdfkit.configuration(wkhtmltopdf=path_wkhtmltopdf)
# 根据url导出pdf
pdf = pdfkit.from_url('http://127.0.0.1:8000/report_detail/1', False, configuration=config)
response = HttpResponse(pdf, content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="111.pdf"'
return response
# path_wkhtmltopdf = 'D:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe'
# config = pdfkit.configuration(wkhtmltopdf=path_wkhtmltopdf)
# retReport = getReport(report_id)
# template = get_template('123.html')
# html = template.render({'retReport': retReport})
# options = {
# 'page-size': 'Letter',
# 'encoding': "utf-8",
# 'javascript-delay': '5000'
# }
# 根据html导出pdf
# pdf = pdfkit.from_string(html, False, configuration=config, options=options)
# response = HttpResponse(pdf, content_type='application/pdf')
# response['Content-Disposition'] = 'attachment; filename="123.pdf"'
# return response
3.xhtml2pdf
pip安装,需要中文字体,否则乱码
def font_path():
# pdfmetrics.registerFont(TTFont('yh', '{}/fonts/msyh.ttf'.format(settings.STATICFILES_DIRS[0])))
pdfmetrics.registerFont(TTFont('yh', '{}\\fonts\\msyh.ttf'.format(settings.STATICFILES_DIRS[0])))
DEFAULT_FONT['helvetica'] = 'yh'
def download(request, report_id):
retReport = getReport(report_id)
template = get_template('123.html')
html = template.render({'retReport': retReport})
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="report.pdf"'
result = BytesIO()
font_path()
pisaStatus = pisa.CreatePDF(BytesIO(html.encode('utf-8')), dest=response, encoding='utf-8')
result.close()
return response
4.截屏
from reportlab.pdfgen import canvas
from PIL import ImageGrab
def download(request, report_id):
retReport = getReport(report_id)
im = ImageGrab.grab()
im.save('d:\\test1.png')
(w, h) = Image.open('d:\\test.png').size
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename=test.pdf'
p = canvas.Canvas(response, pagesize=portrait((w, h)))
p.drawImage('d:\\test.png', 0, 0, w, h)
p.showPage()
p.save()
return response
5.js
通过前端js将页面表格导出为PDF(一)
html转成pdf,下载(html2canvas和jsPDF)
参考文章:
用python将html页面转换成pdf文件,顺便解决中文乱码
Django使用reportlab套件生成PDF文件
使用ReportLab绘制PDF










网友评论