美文网首页
Django下载pdf文件

Django下载pdf文件

作者: 葡萄柚子茶 | 来源:发表于2020-07-14 17:17 被阅读0次

导出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

相关文章

  • Django下载pdf文件

    导出pdf的需求,可以说不难实现,但根据项目要求,页面上存在js渲染的表格,直接用wkhtmltopdf没办法生成...

  • Django_中文教程[www.rejoiceblog.com]

    下载地址:Django_中文教程[www.rejoiceblog.com].pdf

  • JS下载PDF文件

    由于需求需要将数据下载为PDF文件,由于性能还有工时考量没有使用后端生成PDF,而是采用js下载PDF文件, 使用...

  • 生成PDF文件

    Django能够使用视图动态地输出PDF文件。 这是由优秀的开源ReportLab Python PDF库实现的。...

  • 干货!PDF文档如何创建?

    PDF文件如何用创建?众所周知,PDF文件不仅阅读方便,而且集约的PDF文件比原来的源文件小很多,在Web上下载文...

  • 2020-07-22 web项目引入PDF.js并添加水印禁止下

    目录web项目引入PDF.js并添加水印禁止下载 下载并引入PDF.js实现预览动态预览PDF文件隐藏打开、下载、...

  • [XDCTF]MISC

    OWASP http://ctf.xidian.edu.cn/challenges文件下载 下载是一个pdf文件,...

  • PDF文件如何加水印

    办公处理PDF文件时,为了保护PDF文件不被他人所用,会将一些下载的文件添加上水印,防止别人侵权,那么PDF文件如...

  • vue 日常使用

    一. vue 使用 pdf 插件 使用Vue Cli生成项目 下载pdf.js 解压下载后的文件,将文件夹里面的b...

  • 用这个方法,PDF压缩能减少66%体积

    网上下载回来的PDF文件,因为作者没有进行处理,往往导致PDF文件的体积很大。其实是因为这些PDF文件中含有大量图...

网友评论

      本文标题:Django下载pdf文件

      本文链接:https://www.haomeiwen.com/subject/vosfhktx.html