flask 文件转为pdf并添加二维码
背景:
宝安区需求,企业会下载表格,打印后填报。填报后收上表格,统一录入PDA。因为某台PDA只能录某个地方的表格,所以他们希望纸质表上有个二维码,扫描出现填报公司的一些信息,以及统计(好像是这样,没文档,口头说的)。
访问文件下载接口,传入user_id,就能下载到带有user_id二维码的问卷,扫描二维码,会出现一个信息页面,点击完成按钮,会将该公司状态更新为完成。
很小的项目,从头到尾简单纪录一下
整个项目

flask框架:main.py
import sys, time, os
from util import *
from flask import Flask, jsonify, g, make_response, send_from_directory, request, render_template
from flask_cors import CORS
reload(sys)
sys.setdefaultencoding('utf8') app = Flask(__name__)
app.app_context().push() @app.before_request
def before_request():
pass @app.after_request
def after_request(response):
response.headers['Access-Control-Allow-Origin'] = '*'#处理跨域
return response @app.route('/report/down')
def down():
user_id = request.args['user_id']
count(user_id, 'down')
file_name = mergePdf(user_id)
remove_file(file_name)
return send_from_directory(os.getcwd(), file_name, as_attachment=True) @app.route('/report/complete')
def complete():
user_id = request.args['user_id']
count(user_id, 'complete')
return jsonify({}) @app.route('/report/detail')
def detail():
info = reportInfo()
info['noComplete'] = info['len']-info['down']
info['area_name'] = '西乡街道'#暂时写死
info['user_id'] = request.args['user_id']
return render_template("result.html", info=info) @app.route('/report/report_info')
def report_info():
return jsonify(reportInfo()) def runFlask(port):
app.run(host='0.0.0.0', port=port, threaded=True)#异步请求
CORS(app, supports_credentials=True) if '__main__' == __name__:
runFlask()
主要方法:util.py
生成pdf这块做得比较麻烦(有其他方法请跟我说)
画布生成pdf,先画表格图片,再画二维码图片
二维码是浮在原文件左上角,好像只能用画布的形式才能生成,而画布生成的pdf只有一页(就算设置了pageSize,打印的时候也只有一页),所以生成了多个pdf,最后再合并的
import qrcode, PyPDF2, codecs, os, time
from threading import Thread
from config import MRedis
from reportlab.lib.pagesizes import letter, A4
from reportlab.lib.units import inch
from reportlab.pdfgen import canvas def async(f):
def wrapper(*args, **kwargs):
thr = Thread(target = f, args = args, kwargs = kwargs)
thr.start()
return wrapper def count(user_id, status):
MRedis.hset("reportCount", user_id, status) def reportInfo():
result = {
'down': ,
'complete':
}
obj_name = "reportCount"
keys = MRedis.hkeys(obj_name)
for i in keys:
status = MRedis.hget(obj_name, i)
result[status] = result[status]+
result['len'] = len(keys)
return result def getQRCode(user_id):
qr=qrcode.QRCode(version = ,error_correction = qrcode.constants.ERROR_CORRECT_L,box_size=,)
qr.add_data('http://服务器/report/detail?user_id='+user_id)
# qr.add_data('http://10.0.0.17:9090/report/detail?user_id='+user_id)
qr.make(fit=True)
img = qr.make_image()
img_name = getQRName(user_id)
img.save(img_name)
return img_name def getQRName(user_id):
return user_id+'.png' def getPdfNameByName(user_id, name):
return user_id +'_'+ name.split('.')[]+'.pdf' def createPdf(user_id, name, path='base_imgs/'):
width, height = A4
c = canvas.Canvas(getPdfNameByName(user_id, name), pagesize=A4)
c.drawImage(path+name, , , height=height, width=width)
c.drawImage(getQRCode(user_id), , height-, height=, width=)
c.save() @async#10秒后删除文件
def remove_file(path):
time.sleep()
os.remove(path) def mergePdf(user_id):
imgs = {
: '611.jpg',
: '611-1.jpg',
: '611-2.jpg',
: '611-3.jpg',
: '611-4.jpg',
: '611-5.jpg',
: '611-6.jpg',
: '612.jpg',
}
for idx in imgs:
createPdf(user_id, imgs[idx]) pdfwriter = PyPDF2.PdfFileWriter()
pdfreader = PyPDF2.PdfFileReader(open('base_imgs/base.pdf', "rb")) fs = {}#文件对象,等写入pdf完成,关闭所有文件流,以做删除
for page in range(pdfreader.numPages):
if page in imgs:
file_path = getPdfNameByName(user_id, imgs[page])
f = open(file_path, "rb")
temp = PyPDF2.PdfFileReader(f)
pdfwriter.addPage(temp.getPage())
fs[file_path] = f
else:
pdfwriter.addPage(pdfreader.getPage(page)) file_name = user_id + '_all.pdf'
with codecs.open(file_name, 'wb') as f:
pdfwriter.write(f) os.remove(getQRName(user_id))#删除二维码
for path in fs:
fs[path].close()#关闭流
os.remove(path)#删除文件 return file_name
配置文件:config.py
使用redis中set保存问卷下载状态,某企业下载,往reportCount添加key,key的值分别为down, complete
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=)
MRedis = redis.Redis(connection_pool=pool)
扫描二维码显示页面:templates/result.html
点击按钮,将状态更新为完成
<!DOCTYPE html>
<html>
<head>
<title>你的信息</title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
<table>
<h1>你的信息</h1>
<h3>法人码:{{info.user_id}}</h3>
<h3>所属区域:{{info.area_name}}</h3>
<h1>问卷信息</h1>
<h3>已下载:{{info.down}}</h3>
<h3>已完成:{{info.complete}}</h3>
<h3>未完成:{{info.noComplete}}</h3>
<button id="completeBtn">已完成问卷上传请点这里</button>
</table>
<script>
function getUrlParam (name){
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)")
var r = window.location.search.substr().match(reg)
if (r !== null)
return unescape(r[])
return null
}
$(document).ready(function(){
$('#completeBtn').click(function(){
$.ajax({
url: 'http://服务器/report/complete?user_id='+getUrlParam('user_id'),
success: function(obj){
alert('您的问卷状态已更新为完成!')
location.reload()
}
})
})
})
</script>
</body>
</html>
nginx转发配置,server内加入
location /report {
proxy_pass http://127.0.0.1:9090/report;
}
pdf转高清图片
直接用ps转,高清大图
https://jingyan.baidu.com/article/a3f121e4e08725fc9052bb00.html
flask 文件转为pdf并添加二维码的更多相关文章
- PDF文件添加二维码水印教程
maven配置iText的jar,主要不是所有私服都有iText的jar,maven仓库没有的,可以去https://mvnrepository.com/artifact/com.itextpdf/i ...
- 关于JAVA实现二维码以及添加二维码LOGO
今天在公司,完成了之前的任务,没有什么事做,就想鼓捣一下二维码,因为之前没有接触过,我就去翻看了几本书,也基本完成了二维码的实现,以及添加二维码的LOGO. 现在绘制二维码一般都使用的是谷歌的zxin ...
- 【转】如何在您的PCB大作上添加二维码?
开篇先给大家来段新闻截选: “8月20日,新加坡总理李显龙在国庆群众大会上演讲时,称中国移动支付(电子支付)领先全球,新加坡的移动支付还很落后,上海路边摊都有移动支付,新加坡人去上海就像乡巴佬. 这番 ...
- FastReport 中添加二维码功能.(Delphi)
http://www.cnblogs.com/fancycloud/archive/2011/07/24/2115240.html FastReport 中添加二维码功能.(Delphi) 在实际 ...
- App阅读pdf和扫描二维码功能
在之前开发的Android手机App中,需要实现阅读pdf和扫描二维码的功能,在github 上找到大牛封装好包,亲测可用. 阅读pdf: https://github.com/barteksc/An ...
- thisnkphp添加二维码
Rcode二维码生成类QRcode.class.php实例演示 <?php //import('@.Org.QRcode');//thinkphp include_once('QRcode.cl ...
- C#添加二维码带加密带logo
#region 生成QR码,加密与logo在此处修改 public static void CreateQr(string strQrContent, DataTable myTable) { Qr ...
- Java 添加条码、二维码到PDF文档
本文介绍如何通过Java程序在PDF文档中添加条码和二维码.创建条码时,可创建多种不同类型的条码,包括Codebar.Code11.Code128A.Code128B.Code32.Code39.Co ...
- itextsharp操作pdf——插入图片、二维码等
简单介绍 业务需求,需要往pdf图纸上添加二维码功能,将实现过程记录下来 下载类库 直接下载 添加引用 添加命名空间 using System.IO; using iTextSharp.text.pd ...
随机推荐
- LOJ#510 北校门外的回忆(找性质+倍增+线段树)
这题一场模拟赛我们出了弱化版(n<=1e6),抄题面给的程序能拿到71分的好成绩 其实后面的29分是加了几个1e9的数据卡人 这糟老头子真是坏得很 正解我们机房看了三天 在这里感谢这篇题解的作者 ...
- web字体的设置
@font-face { font-family: 'OpenSans'; src: url("../fonts/open-sans-v15-latin-regular.woff2" ...
- ACM-ICPC 2015 BeiJing
比赛连接:ACM-ICPC 2015 BeiJing 本次比赛只写了 A G 然后 I题随后补 A 有一个正方形土地,上面有若干块绿洲.让你以x0为界限划一条竖线,要求左边绿洲面积>=右 ...
- Manjaro下Steam无法启动
问题描述 直接在桌面环境运行Steam,不会出现任何反应,甚至没有闪过一个对话框. 在终端中运行Sterm,出现以下提示 Repairing installation, linking /home/z ...
- 【CF1042D】Petya and Array 离散化+树状数组
题目大意:给定一个长度为 N 的序列,给定常数 t,求有多少个区间 [l,r] 满足 \(\sum\limits_{i=l}^{r}a_i<t\). 题解:先跑一边前缀和,问题等价于求有多少个数 ...
- 软件在 win7 上运行时显示乱码
一个用户反应后,我当时就蒙圈了,因为之前从未遇到过: 百度一下后,发现用户的这种情况比较特殊,从表面上看,[控制面板]和[注册表]相关项设置都正常,为什么还显示乱码呢? 到最后一步如果已经是(简体,中 ...
- SQL问题+知识点总结总
1.SQL中的内置函数有哪些?(Count.Sum.Avg.Max.Min) 2.SQL查询语句的执行顺序.(先执行from语句,再执行条件语句,最后执行Select 语句投影查询信息) 3.Havi ...
- PHP ACCESS-CONTROL-ALLOW-ORIGIN ,设置跨域头
php里允许别的域名跨域访问,先解释下跨域 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制. 所谓同源是指,域名,协议,端口均相同 ...
- 如何把dedecms数据生成json
最近搞dede搞得头大,长话短说! 名称:json数据调用 功能:调用某个远程连接的json接口,方便同远程站点之间进行通信来调取内容 语法: {dede:json url='http://news/ ...
- jenkins学习:jenkins+gitlab
配置前提: 1.Jenkins已安装git plugin,gitlab plugin,安装过程可参考 https://www.cnblogs.com/zhizhiyin/p/9138309.html ...