1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
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.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()
|