最近做个小程序的项目,其中有一个功能是小程序下载pdf。首先想到的是pdfkit+wkhtmltopdf,因为很方便又简单。
所以我们开始安装吧!
我的环境是centos7.0
Step1 安装
这里有安装的简易教程,一步步走完环境就ok了。
Step2 介绍
一切ok后,我们看下pdfkit支持生成pdf的方式:
1按着文件方式生成:pdfkit.from_file('test.html',file_path, options=options)
2按着url生成: pdfkit.from_url('https://www.baidu.com/',file_path, options=options)
3按着str方式生成: pdfkit.from_string('hello!', file_path, options=options)
因为小程序页面没有Url,只有路径。所以只能用第一或第三种方式
OK,我的思路大概是这样子:
小程序发送请求携带渲染模板需要的参数→django接口获取参数→用django渲染模板页面(服务端渲染才能将数据渲染到源码里)→获取渲染后的源码→使用pdfkit.from_string()生成pdf→把pdf的url返回给小程序下载处理
Step3 实现
创建test.html模板:
django接收参数,并渲染页面,此处要修改render返回参数的源码:
```
def down_pdf(request):
if request.method == 'GET':
dict_data = dict()
datalist = []
result = {}
#接收参数
urls = request.GET.get('url')
# dict_data['page'] = [i for i in range(1,len(dict_data['url'])+1)]
dict_data['name'] = request.GET.get('name')
begin_time = request.GET.get('begin_time')
dict_data['begin_time'] = begin_time.replace('-', '/')
end_time = request.GET.get('end_time')
dict_data['end_time'] = end_time.replace('-', '/')
#处理图片参数
url_list = urls.split(',')
#遍历下标,用作题号
for i, url in enumerate(url_list):
tuple2 = []
resource = {}
resource['index'] = i + 1
resource['url'] = url
tuple2.append(resource)
datalist.append(tuple2)
dict_data['url'] = datalist
#此处需要修改render里的返回参数为content
#如果想要继续正常使用render渲染页面,需要写成:
#content = render(request, 'test.html', dict_data)
# return HttpResponse(content)
#接收render渲染后的html源码
content = render(request, 'test.html', dict_data)
options = {
'page-size': 'Letter',
'margin-top': '0in',
'margin-right': '0.15in',
'margin-bottom': '0.15in',
'margin-left': '0.15in',
'encoding': "UTF-8",
'custom-header': [
('Accept-Encoding', 'gzip')
],
'cookie': [
('cookie-name1', 'cookie-value1'),
('cookie-name2', 'cookie-value2'),
],
'outline-depth': 10,
}
#以此时刻时间戳为标志,生成pdf
import time
timestamp = time.time()
file_path = 'static_files' + '/' + str(int(timestamp)) + '.pdf'
pdfkit.from_string(content, file_path, options=options)
#将生成的pdf放在服务器上
result['url'] = 'https://xxxx.xxxx.cn' + '/' + file_path
return JsonResponse(result, json_dumps_params={'ensure_ascii': False})
```
渲染模板:
使用django渲染,类似于这样,就不多说了
修改render源码:
Step4 运行结果
请求:
访问url结果:
perfect,中间遇到了不少坑,需要慢慢填。第一次写博客,且行且珍惜,加油!