大家好,欢迎来到IT知识分享网。
Python开发打印服务(1)
1.需求背景
在项目开发中,我们经常会遇到打印预览、打印的需求。比如:我们在开发进销存或者其他系统应用时,经常会按照客户的需求来定制报表等。在 Web 项目中,实现打印预览及打印功能,一直以来都是借助 pdf 文件来实现,我们本次打印服务的开发也同样使用 pdf 来实现,这样,前端实现加载 pdf ,然后展现并实现打印非常容易。
2.实现思路

由于 Excel 文件的自动化操作性不是很好,所以采用 Word 文档来进行设计。
3.软件环境
软件 |
版本 |
说明 |
Python |
3.7 |
服务端 |
python-docx |
word文档操作 |
|
rpyc |
远程过程调用 |
|
libreoffice |
7.3 |
word文档到pdf文档转换 |
nginx |
1.18 |
web服务 |
4.端口规划
服务 |
端口 |
打印服务 |
9999 |
web服务 |
9998 |
5.打印服务
打印服务提供两种:
5.1.文本打印
文本打印指的是不改变 word 模板中的非变量内容,仅仅对 word 模板中的变量进行替换。可以有表格,但表格的行数是不变化的。
5.2.表格打印
表格打印指的是除了具有文本打印的功能外,还可以对表格进行扩展,即追加行。这样的情况下,就需要对模板进行约束,具体的约束如下:
表格的最后一行用于定义与数据匹配的行定义。
5.3变量格式
格式:
#变量名#
5.3.系统变量
目前,只提供如下系统变量:
变量 |
说明 |
#sysdate# |
当前日期 |
#systime# |
当前时间 |
#sysdatetime# |
当前日期时间 |
6.模板示例
word 模板示例:

7.数据格式
数据格式为 JSON 格式字符串。
文本打印的数据格式如下:
{ field1: value1, field2: value2, field3: [val1, val2, ......], ...... }
字段值可以为数组,但只能是字符串数组。
表格打印的数据格式如下:
{ field1: value1, field2: value2, field3: [val1, val2, ......], ......, datas: [object1, object2, ......] }
datas 是必须的字段,其中为表格中的行数据。
8.调用打印服务
准备好 word 模板并存放到打印服务所在服务器的对应目录下,然后准备好数据,调用打印服务后会返回生成的 pdf 文档。打印服务提供的方法:
# 文本打印 print_text(模板文件名, json.dumps(数据变量)) # 表格打印 print_table(模板文件名, json.dumps(数据变量))
文本打印调用示例:
# coding: utf-8 import json import rpyc data = {'record_id': '072C47AEC56E11ECC94EC87656', 'record_date': '2022-05-09', 'cb': '午餐', 'cpmc': ['炒鸡蛋', '宫保鸡丁', '姜丝炒大肠'], 'cpmc_string': '炒鸡蛋,宫保鸡丁,姜丝炒大肠', 'lysj': '12:00', 'xswd': -3, 'jgfk': None, 'xhsj': '2022-05-11 12:32:00', 'zrr': '刘某某', 'restaurant_id': '053C8870BC6111EC79D9C', 'restaurant_name': '第一食堂', 'create_time': '2022-04-26 22:34:50', 'creator_id': '86D5AF2EBC8E11EC9C9CD9C', 'creator': '刘大厨', 'org_id': '41C7A328B5B011EC9EDE70C94EC87656', 'state': 1, 'checkers': None} c = rpyc.connect("xxx.xxx.xxx.xxx", 9999) pdf_file = c.root.print_text('splydjb.docx', json.dumps(data)) print(pdf_file) c.close()
生成的 pdf 文档:

表格打印服务调用示例:
# coding: utf-8 import json import rpyc data = { 'record_date': '2022-05-09', 'datas': [ {'record_id': '072C47AEC56E11ECC94EC87656', 'record_date': '2022-05-09', 'cb': '午餐', 'cpmc': ['炒鸡蛋', '宫保鸡丁', '姜丝炒大肠'], 'cpmc_string': '炒鸡蛋,宫保鸡丁,姜丝炒大肠', 'lysj': '12:00', 'xswd': -3, 'jgfk': None, 'xhsj': '2022-05-11 12:32:00', 'zrr': '刘某某', 'restaurant_id': '053C8870BC6111EC79D9C', 'restaurant_name': '第一食堂', 'create_time': '2022-04-26 22:34:50', 'creator_id': '86D5AF2EBC8E11EC9C9CD9C', 'creator': '刘大厨', 'org_id': '41C7A328B5B011EC9EDE70C94EC87656', 'state': 1, 'checkers': None}, {'record_id': '39A33068C4F611ECC94EC87656', 'record_date': '2022-05-09', 'cb': '早餐', 'cpmc': ['大米粥', '混沌', '老虎菜', '绿豆芽', '榨菜肉丝面', '素面条', '手撕包菜', '芝麻香葱饼', '素包子', '切片面包', '牛奶燕麦粥'], 'cpmc_string': '大米粥,混沌,老虎菜,绿豆芽,榨菜肉丝面,素面条,手撕包菜,芝麻香葱饼,素包子,切片面包,牛奶燕麦粥', 'lysj': '06:00', 'xswd': -3, 'jgfk': None, 'xhsj': '2022-04-30 08:00:00', 'zrr': '刘某某', 'restaurant_id': '053C8870BC6111EC79D9C', 'restaurant_name': '第一食堂', 'create_time': '2022-04-26 08:17:15', 'creator_id': '86D5AF2EBC8E11EC9C9CD9C', 'creator': '刘大厨', 'org_id': '41C7A328B5B011EC9EDE70C94EC87656', 'state': 0, 'checkers': None}, {'record_id': 'B058C39AC4A211ECB79470C94EC87656', 'record_date': '2022-05-09', 'cb': '晚餐', 'cpmc': ['炖牛排', '烩菜', '鸡蛋蒸日本豆腐', '京酱肉丝', '鸡蛋汤', '蛤蜊蛋花汤'], 'cpmc_string': '炖牛排,烩菜,鸡蛋蒸日本豆腐,京酱肉丝,鸡蛋汤,蛤蜊蛋花汤', 'lysj': '18:00', 'xswd': -3, 'jgfk': None, 'xhsj': '2022-04-28 22:17:00', 'zrr': '刘某某', 'restaurant_id': '053C8870BC6111EC79D9C', 'restaurant_name': '第一食堂', 'create_time': '2022-04-25 22:19:16','creator_id': '86D5AF2EBC8E11EC9C9CD9C', 'creator': '刘大厨', 'org_id': '41C7A328B5B011EC9EDE70C94EC87656', 'state': 0, 'checkers': None}]} c = rpyc.connect("xxx.xxx.xxx.xxx", 9999) pdf_file = c.root.print_table('splydjb.docx', json.dumps(data)) print(pdf_file) c.close()
生成的 pdf 文档:

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/180644.html