Office 文件转 PDF 之服务实战

Python技术

共 4814字,需浏览 10分钟

 ·

2020-10-13 19:21

e6fb48c46c8f004c4bc726a36c0b2684.webp

文 | 潮汐

来源:Python 技术「ID: pythonall」

8d9fb1b576e06f8fe72e4ce8f46eaf5d.webp


小编之前写了一篇关于 Office 文件转 PDF 的实战文章,详见Python 小技之 Office 文件转 PDF但是在平时的工作中,咱们需要通过接口的形式来调用具体的转换逻辑,同时开可以将文件转换写成服务的形式,将服务开启后传入参数或者地址即可直接调用逻辑转换,今天的文章主要讲解如何将文件转换写成服务;

一起拭目以待吧!!!

文件服务器

Office 文件转 PDF 涉及到文件的传输,所以考虑用文件服务器来进行文件的传递,客户端如果有文件服务器的话, 同样在服务端也需要写一个文件服务器来返回转换完成的文件,以供客户端使用,文件服务器实现思路如下:

前端文件上传下载页面


    "download" method="GET",enctype="multipart/form-data">
        要下载的文件: type="text" value="请上传文件" name="filename" />
        type="submit" value="download">
    

    "/file_server/cgi-bin/upload.py" method="POST" enctype="multipart/form-data">
        要上传的文件: type="file" name="filename" />
        type="submit" value="upload">
    

上传文件

上传文件 upload.py 部分代码如下:

import cgi, os

form = cgi.FieldStorage()

item = form["filename"]

if item.filename:
    fn = os.path.basename(item.filename)
    open("/home/sxhlinux/data/" + fn, "wb").write(item.file.read())
    msg = "File" + fn + ' upload successfully !'
else:
    msg = 'no file is uploaded '

print("""\
Content-type: text/html\n



Hello world


名称: %s




"""
 % (msg,))

下载文件

下载文件 download.py 部分代码如下:

form = cgi.FieldStorage()

filename = form.getvalue('filename')

dir_path = "F:/WorkSpace/FilesToPDF/file_server/tmp"

target_path = dir_path + str(filename)

if os.path.exists(target_path) == True:
    print("Content-Type: application/octet-stream")
    print('Content-Disposition: attachment; filename = "%s"' % filename)

    print(target_path)

    sys.stdout.flush()
    fo = open(target_path, "rb")
    sys.stdout.buffer.write(fo.read())
    fo.close()
else:
    print("""\
            Content-type: text/html\n
            
            
            utf-8">
            File server
            
            
            

 %s doesn't exist in the server:
            files in the server list below: 

"
"" % filename)

    for line in os.popen(filename):
        name = line.strip().split(' ', 8)
        type(name)
        if len(name) == 9:
            print("""
            /cgi-bin/download.py" method="get">%s
            submit" name="filename" value="%s">
            "
"" % (line, name[8]))

文件服务

文件服务入口 server.py 部分代码如下:


if __name__ == '__main__':
    try:
        handler = CGIHTTPRequestHandler
        handler.cgi_directories = ['/cgi-bin''/htbin']
        #port = int(sys.argv[1])
        port = 8001
        print('port is %d' % port)
        server = HTTPServer(('', port), handler)
        print('Welcome to my website !')
        server.serve_forever()

    except KeyboardInterrupt:
        print('^C received, shutting down server')
        server.socket.close() 

以上服务启动后即可使用。

转换逻辑接口

转换接口使用了 Python Flask框架,在文件转换逻辑里面需要引入具体的转换逻辑,接口逻辑实现代码如下:

from flask import Flask, render_template,request
import requests
import config
from requests import get
import files2pdf  # 引入转换逻辑
import os, shutil
from flask import Flask, render_template, url_for, send_from_directory,json,make_response,jsonify

app = Flask(__name__, static_folder='/static')
app.config.from_object(config)
app.config["SECRET_KEY"] = "123456"

@app.route('/')
def index():
    return "Welcome to You,Please visit the url:http://IP:5000/upload_file?filePath=xxx.pptx"

#pathname = ''
@app.route('/upload_file', methods=['GET', 'POST'])
def upload_file():
        if request.method == 'POST' or request.method == 'GET':
            file_url = request.args.get('filePath''')
            req = get(file_url)
            if req.status_code == 404:
                print("no file")

                return
            # 取正确的转换文件名称
            filename = file_url.split('/')[-1]
            name = filename.split('?')[1]
            ppt_name = name.split('=')[-1]
            print(ppt_name)

            with open(ppt_name, "wb"as file:
                # get request
                # response = get(url)
                # write to file
                file.write(req.content)

            # 判断要转换的文件是否存在
            if os.path.exists(ppt_name) and not os.path.exists(file_path + '/' + ppt_name):
                shutil.move(ppt_name, file_path)
            elif os.path.exists(ppt_name) and os.path.exists(file_path + '/' + ppt_name):
                print('file alreadly exists')
                os.remove(ppt_name)
                print("already deleted exists file")

            pdfConverter = files2pdf.PDFConverter(file_path + '/' + ppt_name)  # 调用文件转换逻辑
            # print("transform complete:"+pdfConverter)
            pdfConverter.run_conver()

            # file transform finshed --> Get file's name
            re_name = ppt_name.replace('.pptx''.pdf')
            print('New name is:' + re_name)
            # /static/%E6%B0%B4%E9%92%A2%E9%9B%86%E5%9B%A2%E6%99%BA%E6%85%A7%E5%85%9A%E5%BB%BA%E5%9F%B9%E8%AE%AD%E8%B5%84%E6%96%990420%282%29.pdf
            re_url = 'IP:8001'  # 文件服务地址
            # urlfor = url_for('static', filename=re_name)
            return re_url + url_for('static', filename=re_name)
            #return  render_template('result_link.html')

if __name__ == '__main__':

    app.run(host='0.0.0.0', port=5000)
    

调用

先启动 server.py 后再启动 flaskdemo.py 传入参数即可调用逻辑。也可以用 postman 调用,调用实例如下:

0200655b36f5b3c084ded18d3d08d70f.webp

总结

今天的文章主要是继上一篇 Python 实战之小工具的运用的延申,希望对大家有所帮助,如有问题咱们讨论区见!

So 今天的小 Tip 你安利到了吗?

PS公号内回复「Python」即可进入Python 新手学习交流群,一起 100 天计划!


老规矩,兄弟们还记得么,右下角的 “在看” 点一下如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!

5dd58023304d4cdd041ab958f5b4411b.webp18a44beb74388b990e4f458fc444c6e4.webp

代码获取方式

识别文末二维码,回复:201013

浏览 26
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报