如何在Django中从HTML创建PDF

本文概述

  • 要求
  • 实现
  • 例子
  • 其他设定
  • 基本故障排除
与PHP不同, 没有很多可用的库可以用Python中的HTML创建PDF, 但是并不支持该库。在本文中, 你将学习如何在Django中使用wkhtmltopdf创建PDF。
wkhtmltopdf是一个命令行工具, 可使用Qt WebKit渲染引擎将HTML渲染为PDF和各种图像格式。它们完全” 无头运行” , 不需要显示或显示服务。
要求 你需要wkhtmltopdf在系统中可用并且在命令提示符下可访问。
  • Windows:你可以在安装区域中下载每种体系结构(x86和x64)的安装程序。尽管你可以稍后在代码中更改wkhtmltopdf可执行文件的路径, 但是建议将wkhtmltopdf用作系统上的环境变量。你可以在本文中阅读如何在Windows中创建环境变量。
  • Debian / Ubuntu:你可以使用以下命令直接在控制台中从wkhtmltopdf安装发行版:
$ sudo apt-get install wkhtmltopdf

警告! debian / ubuntu仓库中的版本功能减少(因为它编译时未添加wkhtmltopdf QT补丁), 例如添加了轮廓, 页眉, 页脚, TOC等。要使用此选项, 应从wkhtmltopdf网站安装静态二进制文件, 或者可以使用此脚本。
在此处访问wkhtmltopdf的主页以获取更多信息。
实现 现在我们的环境中已经有wkhtmltopdf可用, 我们只需要使用它即可!但是, 使用PDFKit可以轻松地在Django中创建PDF, 而不是自己处理控制台命令。 PDFKit是一个Python包装器, 可使用Webkit呈现引擎(wkhtmltopdf)和qt将html转换为pdf, 你可以访问Github中的存储库以获取更多信息。
使用以下命令将PDFKit库包含到django项目中:
$ pip install pdfkit

由于wkhtmltopdf为你完成了艰苦的工作, 因此PDFKit的使用非常简单, 几乎涵盖了所有用例:
  • 从html字符串创建PDF。
  • 从Web网址(外部或项目网址)创建PDF。
#import pdfkit into your classimport pdfkit# Generate PDF from a web URL (maybe only from your project)pdfkit.from_url('http://google.com', 'out.pdf')# Generate PDF from a html file.pdfkit.from_file('file.html', 'out.pdf')# Generate PDF from a plain html string.pdfkit.from_string('Hello!', 'out.pdf')# Save the PDF in a variablemyPdf = pdfkit.from_url('http://google.com', False)

你基本上可以轻松, 快速地动态生成PDF。
例子 使用Django和PDFKit生成PDF很容易, 请查看以下示例:
将PDF保存在服务器上
要在本地保存PDF, 请使用任何方法并提供将文件保存为第二个参数的路径和文件名。
import pdfkitfrom django.http import HttpResponsedef index(request):pdf = pdfkit.from_url("http://ourcodeworld.com", "ourcodeworld.pdf")return HttpResponse("Everything working good, check out the root of your project to see the generated PDF.")

前面的示例将在Django项目的根目录中创建PDF。
传回PDF作为回应
你可以直接从PDFKit中检索文件, 而无需将其保存在系统中, 只需提供False作为目标参数即可。
你可以使用以下代码段返回PDF作为响应:
import pdfkitfrom django.http import HttpResponsedef index(request):# Use False instead of output path to save pdf to a variablepdf = pdfkit.from_url('http://ourcodeworld.com', False)response = HttpResponse(pdf, content_type='application/pdf')response['Content-Disposition'] = 'attachment; filename="ourcodeworld.pdf"'return response

如果使用此功能导航至路线, 浏览器将开始下载由控制器生成的PDF。
从项目路线生成PDF
你可以从你的项目的路线(显然需要注册)生成PDF并使用pdf.from_url方法。
import pdfkitfrom django.http import HttpResponsedef template(request):# Returns some HTML as responsereturn HttpResponse("< h1> Hello World< /h1> ")def pdf(request):# Create a URL of our project and go to the template routeprojectUrl = request.get_host() + '/template'pdf = pdfkit.from_url(projectUrl, False)# Generate downloadresponse = HttpResponse(pdf, content_type='application/pdf')response['Content-Disposition'] = 'attachment; filename="ourcodeworld.pdf"'return response

pdf输出将是Hello World的文档!作为内容。
注意:或者, 你可以在变量中将模板呈现为html, 然后使用pdfkit.from_string方法, 而不是向项目的端点创建请求。
其他设定 自定义wkhtmltopdf路径
如果要修改wkhtmltopdf所在的路径, 可以使用pdfkit的配置方法进行更改:
config = pdfkit.configuration(wkhtmltopdf='/opt/bin/wkhtmltopdf'))pdfkit.from_string("< h1> Hello World< /h1> ", output_file, configuration=config)

PDF设置
你可以指定所有wkhtmltopdf选项。你可以在选项名称中添加” –” 。如果选项没有值, 则对dict值使用None, False或” :
options = {'page-size': 'Letter', 'margin-top': '0.75in', 'margin-right': '0.75in', 'margin-bottom': '0.75in', 'margin-left': '0.75in', 'encoding': "UTF-8", 'no-outline': None}pdfkit.from_url('http://google.com', 'out.pdf', options=options)

wkhtmltopdf输出
默认情况下, PDFKit将显示所有wkhtmltopdf输出:
如何在Django中从HTML创建PDF

文章图片
如果你不想要它, 则需要在所用方法的配置中设置静默选项:
options = {'quiet': ''}pdfkit.from_url('google.com', 'out.pdf', options=options)

基本故障排除 在Python中使用PDFKit时, 有两个已知的常见问题:
IOError-找不到wkhtmltopdf可执行文件
发生此错误的原因是你的系统中没有wkhtmltopdf分发。如果已经安装, 则在控制台中可能无法作为命令使用。打开系统控制台, 并验证wkhtmltopdf命令是否存在。
IOError-命令失败
wkhtmltopdf出了点问题, 无法实现该操作。尝试在控制台中执行plain命令, 并检查任何可能的错误(该网页不存在, 该文件不存在, 等等)。
【如何在Django中从HTML创建PDF】玩得开心 !

    推荐阅读