【问题标题】:Generating PDFs with Django 1.9使用 Django 1.9 生成 PDF
【发布时间】:2016-04-18 14:55:34
【问题描述】:

我想使用 Django 1.9 文档中的以下方法生成 PDF:https://docs.djangoproject.com/ja/1.9/howto/outputting-pdf

这是我的 url 模式(我不需要任何特别的,只是像这样的不同 url 名称

urlpatterns = [
   url(r'^people/$', PeopleTemplate.as_view(), name='people'),
   url(r'^people/pdf/$', some_view),
 ]

  def some_view(request):
      response = HttpResponse(content_type='application/pdf')
      response['Content-Disposition'] = 'attachment; filename="example.pdf"'
      p = canvas.Canvas(response)
      p.drawString(100, 100, "Hello world.")
      p.showPage()
      p.save()

      def get(self, request, *args, **kwargs):
          context = locals()
          context['response'] = self.response
          context['p'] = self.p
          return render_to_response(self.response_template, context, context_instance=RequestContext(request))

我正在尝试使用 get 方法。当我点击 /pdf 时,这会提示一个 pdf 输出,但不包含任何数据 - 只是一个空白页。当您点击 /attendance/pdf url 时,如何获取此 url /attendance/ 中存在的数据以显示在 pdf 页面上?

【问题讨论】:

  • 试试你正在看的下面那个复杂的 pdfs 教程,也许会奏效。
  • 是的,也试过了,同样的结果

标签: python django django-templates pdf-generation


【解决方案1】:

我认为你需要:

  1. 渲染html
  2. 转换成pdf
  3. 将 pdf 内容设置为响应正文
  4. 返回响应

现在您的代码将模板呈现为 html,将“application/pdf”内容类型添加到标题并返回正常的 html 页面。

您需要 PDFTemplateView 之类的东西。有现成的包django-easy-pdfdjango-wkhtmltopdf

更新:

  def some_view(request):
      response = HttpResponse(content_type='application/pdf')
      response['Content-Disposition'] = 'attachment; filename="example.pdf"'
      p = canvas.Canvas(response)

      // simple but visual result is not pretty at all
      for i, obj in enumerate(People.objects.all()):
          p.drawString(100, 50*(i+1), str(obj))

      p.showPage()
      p.save()

      def get(self, request, *args, **kwargs):
          context = locals()
          context['response'] = self.response
          context['p'] = self.p
          return render_to_response(self.response_template, context, context_instance=RequestContext(request))

【讨论】:

  • 我更新了我的问题。我现在可以得到 pdf 提示,但里面没有数据。查看我更新的问题。
  • 尝试保存文件并检查其大小。尝试用另一个查看器打开保存的文件。尝试在 pdf 画布上绘制其他内容并重复第一步。
  • 如果您看到响应,现在您需要使用 reportlab API 将普通数据添加到 pdf。首先使用 Django orm(类似于 People.objects.all())从 db 获取数据。然后遍历它并将其添加到 pdf 画布。
  • 我在该代码上收到此错误“对象没有属性'unicode'”
  • code 将 obj 转换为 unicode 字符串,尝试将“obj.__unicode__()”替换为“str(obj)”。我使用 Python 2.7。
猜你喜欢
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多