本文概述
与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 class
import 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 variable
myPdf = pdfkit.from_url('http://google.com', False)
你基本上可以轻松, 快速地动态生成PDF。
例子
使用Django和PDFKit生成PDF很容易, 请查看以下示例:
将PDF保存在服务器上
要在本地保存PDF, 请使用任何方法并提供将文件保存为第二个参数的路径和文件名。
import pdfkit
from django.http import HttpResponse
def 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 pdfkit
from django.http import HttpResponse
def index(request):
# Use False instead of output path to save pdf to a variable
pdf = 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 pdfkit
from django.http import HttpResponse
def template(request):
# Returns some HTML as response
return HttpResponse("<h1>Hello World</h1>")
def pdf(request):
# Create a URL of our project and go to the template route
projectUrl = request.get_host() + '/template'
pdf = pdfkit.from_url(projectUrl, False)
# Generate download
response = 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输出:
如果你不想要它, 则需要在所用方法的配置中设置静默选项:
options = {
'quiet': ''
}
pdfkit.from_url('google.com', 'out.pdf', options=options)
基本故障排除
在Python中使用PDFKit时, 有两个已知的常见问题:
IOError-找不到wkhtmltopdf可执行文件
发生此错误的原因是你的系统中没有wkhtmltopdf分发。如果已经安装, 则在控制台中可能无法作为命令使用。打开系统控制台, 并验证wkhtmltopdf命令是否存在。
IOError-命令失败
wkhtmltopdf出了点问题, 无法实现该操作。尝试在控制台中执行plain命令, 并检查任何可能的错误(该网页不存在, 该文件不存在, 等等)。
玩得开心 !
评论前必须登录!
注册