加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
wps.py 3.12 KB
一键复制 编辑 原始数据 按行查看 历史
congco 提交于 2022-10-24 17:19 . feat:convert
#!/usr/bin/python3
# **
# * Copyright (c) 2020 Weitian Leung
# *
# * This file is part of pywpsrpc.
# *
# * This file is distributed under the MIT License.
# * See the LICENSE file for details.
# *
# *
import os
import subprocess
import sys
import argparse
from pywpsrpc.rpcwpsapi import (createWpsRpcInstance, wpsapi)
from pywpsrpc.common import (S_OK, QtApp)
formats = {
"doc": wpsapi.wdFormatDocument,
"docx": wpsapi.wdFormatXMLDocument,
"rtf": wpsapi.wdFormatRTF,
"html": wpsapi.wdFormatHTML,
"pdf": wpsapi.wdFormatPDF,
"xml": wpsapi.wdFormatXML,
}
pid = None
class ConvertException(Exception):
def __init__(self, text, hr):
self.text = text
self.hr = hr
def __str__(self):
return """Convert failed:
Details: {}
ErrCode: {}
""".format(self.text, hex(self.hr & 0xFFFFFFFF))
def convert_to(paths, format, abort_on_fails=False):
args = ['wps.py', '-f', format, paths]
QtApp(args)
hr, rpc = createWpsRpcInstance()
if hr != S_OK:
raise ConvertException("Can't create the rpc instance", hr)
hr, app = rpc.getWpsApplication()
if hr != S_OK:
raise ConvertException("Can't get the application", hr)
global pid
hr, pid = rpc.getProcessPid()
if hr != S_OK:
raise ConvertException("Can't get the PID", hr)
print("PID:{}".format(pid))
# we don't need the gui
app.Visible = False
docs = app.Documents
def _handle_result(hr):
if abort_on_fails and hr != S_OK:
raise ConvertException("convert_file failed", hr)
hr = convert_file(paths, docs, format)
_handle_result(hr)
app.Quit()
def convert_file(file, docs, format):
hr, doc = docs.Open(file, PasswordDocument='xxx', ReadOnly=True)
if hr != S_OK:
return hr
out_dir = os.path.dirname(os.path.realpath(file)) + "/out"
os.makedirs(out_dir, exist_ok=True)
# you have to handle if the new_file already exists
new_file = out_dir + "/" + os.path.splitext(os.path.basename(file))[0] + "." + format
ret = doc.SaveAs2(new_file, FileFormat=formats[format])
# always close the doc
doc.Close(wpsapi.wdDoNotSaveChanges)
return ret
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--format", "-f",
required=True,
metavar="<DOC_TYPE>",
choices=["doc", "docx", "rtf", "html", "pdf", "xml"],
help="convert to <DOC_TYPE>,")
parser.add_argument("--abort", "-a",
action="store_true",
help="abort if one convert fails")
parser.add_argument("path",
metavar="<path>",
nargs='+',
help="the <path> can be one or more file or folder")
args = parser.parse_args()
# qApp = QtApp(sys.argv)
try:
convert_to(args.path, args.format, args.abort)
except ConvertException as e:
print(e)
finally:
# ubuntu
if pid is not None:
subprocess.Popen("kill -9 {}".format(pid), shell=True).wait()
if __name__ == "__main__":
main()
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化