grpc 之 word2pdf使用
做一个word转pdf的服务,采用grpc,使用libreoffice命令。
1.构建libreoffice镜像
FROM python:3.6
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN cd /etc/apt \
&& mv sources.list sources.list.bak \
&& echo "deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib \
deb-src http://mirrors.aliyun.com/debian/ stretch main non-free contrib \
deb http://mirrors.aliyun.com/debian-security stretch/updates main \
deb-src http://mirrors.aliyun.com/debian-security stretch/updates main \
deb http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib \
deb-src http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib \
deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib \
deb-src http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib" > sources.list
RUN apt-get update
RUN apt-get install -y libreoffice
COPY ./ /root/
RUN mv /root/simsun.ttc /usr/share/fonts && mv /root/simhei.ttf /usr/share/fonts && cd /usr/share/fonts && fc-cache -fv
# docker build -t libreoffice .
- 采用python3.6镜像
- 使用阿里源
- 安装libreoffice
- 解决中文乱码 加入中文字体
2.grpc服务端、客户端
创建proto配置文件 然后编译
服务端与客户端 采用二进制 数据进行传输
服务端
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/7/9 0009 16:41
# @File : word2pdf_server_main.py
# @author : dfkai
# @Software: PyCharm # python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./data.proto import os
import pathlib
import time
import traceback
import uuid
from concurrent import futures import grpc from proto_py import word2pdf_pb2, word2pdf_pb2_grpc _ONE_DAY_IN_SECONDS = 60 * 60 * 24
_HOST = os.environ.get("HOSTNAME", "localhost")
_PORT = '8080' class FormatData(word2pdf_pb2_grpc.FormatDataServicer):
def DoFormat(self, request, context):
"""
proto 定义方法
:param request:
:param context:
:return:
"""
data = request.text
doc_path, pdf_path, pdf_file_path = self.get_doc_pdf_path()
with open(doc_path, "wb") as f:
f.write(data)
if self.word2pdf_linux(doc_path, pdf_path):
try:
with open(pdf_file_path, "rb") as f:
pdf_data = f.read()
except:
traceback.format_exc()
else:
pdf_data = b"fail"
return word2pdf_pb2.Data(text=pdf_data) def get_doc_pdf_path(self):
"""
获取文件路径
:return:
"""
baseDir = os.getcwd()
p = pathlib.Path(baseDir)
u_name = str(uuid.uuid4()).replace("-", "")
doc_name = u_name + ".docx"
pdf_name = u_name + ".pdf"
pdf_path = p / f"filepath/pdf/"
doc_path = p / f"filepath/doc/{doc_name}"
pdf_file_path = p / f"filepath/pdf/{pdf_name}"
print(doc_path, pdf_path, pdf_file_path)
return rf"{doc_path}", rf"{pdf_path}", rf"{pdf_file_path}" def word2pdf_win(self, doc_path, pdf_path):
"""
windows 生成
:param doc_path:
:param pdf_path:
:return:
"""
from win32com import client
import pythoncom
pythoncom.CoInitialize()
# word = client.Dispatch("Word.Application")
word = client.DispatchEx("Word.Application")
worddoc = word.Documents.Open(doc_path)
try:
worddoc.SaveAs(pdf_path, FileFormat=17)
except Exception as e:
print(e)
return False
finally:
worddoc.Close()
return True def word2pdf_linux(self, doc_path, pdf_path):
"""
linux 生成 pdf ,利用 libreoffice 命令
:param doc_path:
:param pdf_path:
:return:
"""
try:
os.system(f"soffice --headless --invisible --convert-to pdf {doc_path} --outdir {pdf_path} ")
except:
traceback.format_exc()
return False
return True def serve():
"""
rpc 服务
:return:
"""
grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4))
word2pdf_pb2_grpc.add_FormatDataServicer_to_server(FormatData(), grpcServer)
grpcServer.add_insecure_port(_HOST + ':' + _PORT)
grpcServer.start()
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
grpcServer.stop(0) if __name__ == '__main__':
serve()客户端
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/7/9 0009 16:40
# @File : word2pdf_client_main.py
# @author : dfkai
# @Software: PyCharm
import traceback
import grpc
from proto_py import word2pdf_pb2, word2pdf_pb2_grpc _HOST = 'localhost'
_PORT = '8080' def run():
file_name = "test"
doc_name = file_name + '.doc'
conn = grpc.insecure_channel(_HOST + ':' + _PORT)
client = word2pdf_pb2_grpc.FormatDataStub(channel=conn)
with open(doc_name, "rb") as f:
data = f.read()
response = client.DoFormat(word2pdf_pb2.Data(text=data))
if response.text == b"fail":
# 发送消息 生成失败
pass
else:
pdf_name = file_name + f'.pdf'
try:
with open(pdf_name, "wb") as f:
f.write(response.text)
except:
traceback.format_exc()
# 发送消息 生成失败
else:
# 发送消息 生成成功
pass if __name__ == '__main__':
import time
beg = time.time()
run()
end = time.time()
print(end - beg)proto配置文件
syntax = "proto3";
package example;
service FormatData {
rpc DoFormat(Data) returns (Data){}
}
message Data {
bytes text = 1;
}
进入文件目录,构建命令:python -m grpc_tools.protoc -I. --python_out=./proto_py/ --grpc_python_out=./proto_py/ ./proto/word2pdf.proto
3.构建rpc服务端镜像
FROM libreoffice
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY ./ /root/
WORKDIR /root/word2pdfRPC
RUN pip3 install -i https://mirrors.aliyun.com/pypi/simple/ -r requirments.txt
EXPOSE 8080
CMD python server_main.py
# docker build -t word2pdf .
# docker run -d -p 8080:8080 -v /root/data/word2pdf/:/root/word2pdfRPC/filepath/ --name word2pdf word2pdf
reuirements.txt
futures==3.1.1
grpcio==1.22.0
grpcio-tools==1.22.0
protobuf==3.8.0
参考、推荐:
grpc 之 word2pdf使用的更多相关文章
- gRPC源码分析1-SSL/TLS
引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...
- gRPC源码分析2-Server的建立
gRPC中,Server.Client共享的Class不是很多,所以我们可以单独的分别讲解Server和Client的源码. 通过第一篇,我们知道对于gRPC来说,建立Server是非常简单的,还记得 ...
- gRPC源码分析0-导读
gRPC是Google开源的新一代RPC框架,官网是http://www.grpc.io.正式发布于2016年8月,技术栈非常的新,基于HTTP/2,netty4.1,proto3.虽然目前在工程化方 ...
- 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC
Google 刚刚开源了grpc, 一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobuf 本身虽然提供了RPC 的定义语法,但是一直以来,Google 只开 ...
- gRPC .NET Core跨平台学习
前些天发布gRPC C# 学习,在.NET Framework 中使用gRPC ,今天来学习 .NET Core gRPC. gRPC 的.NET Core 包在NuGet 上发布了,结合.NET C ...
- gRPC C#学习
前些天gRPC 发布1.0 版本,代表着gRPC 已经正式进入稳定阶段. 今天我们就来学习gRPC C# .而且目前也已经支持.NET Core 可以实现完美跨平台. 传统的.NET 可以通过Mono ...
- .net core 用grpc实现微服务
GRPC 是Google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架.提供跨语言.跨平台支持.以下以.NET Core 使用控制台.docker中演示如何使用G ...
- rpc框架之gRPC 学习 - hello world
grpc是google在github于2015年开源的一款RPC框架,虽然protobuf很早google就开源了,但是google一直没推出正式的开源框架,导致github上基于protobuf的r ...
- Android开发笔记之《远程控制(MQTT|mosquitto) && (ProtocalBuffer | GRPC)》
Android推送方案分析(MQTT/XMPP/GCM): http://www.open-open.com/lib/view/open1410848945601.htmlMQTT官网: http:/ ...
随机推荐
- 搞定ReentrantReadWriteLock 几道小小数学题就够了
| 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it ...
- list 迭代器的用法
string strTemp; list<string> strList; char *ch = new char[]; strcpy( ch , ""); strTe ...
- 不就是语法和长难句吗—笔记总结Day4
第六课 英语的特殊结构 1.强调句型 It is...that / who / which(少见)... * 强调句型可以强调句子中所有成分(唯一不能强调谓语)* It is obviously t ...
- SpringBoot下Druid连接池的使用配置
Druid是一个JDBC组件,druid 是阿里开源在 github 上面的数据库连接池,它包括三部分: * DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体 ...
- IDEA从Github中Clone Maven项目,解决树形目录及Jar包依赖的问题
很多人在开发中都会碰到的一个问题,当我们用IDEA从Github中检出Maven工程后(Java),发现既不能运行,也不能编译,左侧的树形目录还怪怪的,现在就来说说如何解决这个问题. IDEA从git ...
- C#实现快速查找(递归,非递归)
原文件: http://pan.baidu.com/share/link?shareid=2838344856&uk=3912660076 我英语很烂...哎,我正在努力... 效果图:
- 关于位图数据和标记位-P3
文章目录 1 背景 1.1 问题 2 问题1探究 2.1 没有区的情况 2.2 一个区的情况 2.3 两个区的情况 2.4 三个区的情况 2.5 四个区的情况 2.6 五个区的情况 3 问题2探究 3 ...
- Python必须知道的异常处理
异常处理 把可能会发生的错误,提前在代码里进行捕捉(监测) try : code except Exception: 出错后要执行的代码 下面是常见的异常: attributeError 试图访问一个 ...
- 从零创建发布属于自己的composer包
原文地址:https://www.wjcms.net/archives/从零创建发布属于自己的composer包 今天给大家讲解一下如何从零创建发布属于自己的composer包. composer包用 ...
- 面试必杀技,讲一讲Spring中的循环依赖
本系列文章: 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configu ...