Bootstrap

python:文档转换(只支持Windows操作系统)

一、安装软件

如果使用微软Office转换,那需要在Windows电脑上安装微软Office办公软件

如果使用金山WPS转换,那需要在Windows电脑上安装金山WPS办公软件

二、环境说明

操作系统:Windows10

Python:3.10.1

PyCharm:2021.1.1

三、pypiwin32实现文档转换

1、安装pypiwin32

(1)安装python

安装过的的就跳过吧,没有安装过的请看:win10:python安装

(2)安装PyCharm

这个就自己去网上找吧,我就不提供了哈

(3)更改python仓库镜像源

点击FileSettings…,如下:

在这里插入图片描述

依次打开Project: pythonProjectPython Interpreter,然后点击右侧 + 号,如下:

在这里插入图片描述

点击Manage Repositories按钮,如下:

在这里插入图片描述

删除原有镜像源,添加豆瓣镜像源https://pypi.douban.com/simple/,点击OK保存即可,操作结果截图如下,:

在这里插入图片描述

(4)在PyCharm中安装pypiwin32(不安装会影响开发)

在搜索框中搜索pypiwin32,选中pypiwin32之后点击Insatall Package按钮即可,如下:

在这里插入图片描述

(5)在Windows中安装pypiwin32(不安装很有可能会影响打exe文件)

pypiwin32就是需要安装的插件

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pypiwin32

2、文档转换

说明:

只要目标文件后缀名不变,那么FileFormat就不会变化,所以wps、doc、docx转docx的FileFormat都是12

(1)doc / docx =》 pdf

注意:

下面代码适用于微软Word,如果使用金山WPS,需要把代码中的 Word.Application 换成 Kwps.Application

代码:

from win32com.client import DispatchEx
import sys

soft = DispatchEx('Word.Application')

try:
    doc = soft.Documents.Open("word源文件全路径")
    doc.SaveAs("生成pdf文档全路径", FileFormat=17)
    doc.Close()
except:
    print("错误信息:", sys.exc_info())

soft.Quit()

例如:

from win32com.client import DispatchEx
import sys

soft = DispatchEx('Word.Application')

try:
    doc = soft.Documents.Open("C:\\test\\20221020\\111.docx")
    doc.SaveAs("C:\\test\\20221020\\111.pdf", FileFormat=17)
    doc.Close()
except:
    print("错误信息:", sys.exc_info())
    
soft.Quit()

拓展:

如果大家想看到具体使用的软件,可以在try语句下方添加soft.Visible = True,不过所用软件会在任务栏一闪而过,所以要注意下任务栏,完整代码如下:

from win32com.client import DispatchEx
import sys

soft = DispatchEx('Word.Application')

try:
	soft.Visible = True
    doc = soft.Documents.Open("C:\\test\\20221020\\111.docx")
    doc.SaveAs("C:\\test\\20221020\\111.pdf", FileFormat=17)
    doc.Close()
except:
    print("错误信息:", sys.exc_info())
    
soft.Quit()

(2)xls / xlsx =》 pdf

注意:

下面代码适用于微软Excel,如果使用金山WPS,需要把代码中的 Excel.Application 换成 Ket.Application,但是经过我的测试,发现目前不支持金山WPS

代码:

from win32com.client import DispatchEx
import sys

soft = DispatchEx('Excel.Application')

try:
    doc = soft.Workbooks.Open("excel源文件全路径")
    doc.SaveAs("生成pdf文档全路径", FileFormat=57)
    doc.Close()
except:
    print("错误信息:", sys.exc_info())

soft.Quit()

例如:

from win32com.client import DispatchEx
import sys

soft = DispatchEx('Excel.Application')

try:
    doc = soft.Workbooks.Open("C:\\test\\20221020\\333.xlsx")
    doc.SaveAs("C:\\test\\20221020\\333.pdf", FileFormat=57)
    doc.Close()
except:
    print("错误信息:", sys.exc_info())
    
soft.Quit()

(3)ppt / pptx =》 pdf

注意:

下面代码适用于微软PPT,如果使用金山WPS,需要把代码中的 Powerpoint.Application 换成 Kwpp.Application

代码:

from win32com.client import DispatchEx
import sys

soft = DispatchEx('Powerpoint.Application')

try:
    doc = soft.Presentations.Open("ppt源文件全路径")
    doc.SaveAs("生成pdf文档全路径", FileFormat=32)
    doc.Close()
except:
    print("错误信息:", sys.exc_info())

soft.Quit()

例如:

from win32com.client import DispatchEx
import sys

soft = DispatchEx('Powerpoint.Application')

try:
    doc = soft.Presentations.Open("C:\\test\\20221020\\555.pptx")
    doc.SaveAs("C:\\test\\20221020\\555.pdf", FileFormat=32)
    doc.Close()
except:
    print("错误信息:", sys.exc_info())

soft.Quit()

(4)doc / docx =》 html

注意:

下面代码适用于微软Word,如果使用金山WPS,需要把代码中的 Word.Application 换成 Kwps.Application

代码:

from win32com.client import DispatchEx
import sys

soft = DispatchEx('Word.Application')

try:
    doc = soft.Documents.Open("word源文件全路径")
    doc.SaveAs("生成html网页全路径", FileFormat=17)
    doc.Close()
except:
    print("错误信息:", sys.exc_info())

soft.Quit()

例如:

from win32com.client import DispatchEx
import sys

soft = DispatchEx('Word.Application')

try:
    doc = soft.Documents.Open("C:\\test\\20221020\\111.docx")
    doc.SaveAs("C:\\test\\20221020\\111.html", FileFormat=10)
    doc.Close()
except:
    print("错误信息:", sys.exc_info())

soft.Quit()

(5)wps =》 doc / docx

注意:

下面代码适用于微软Word,如果使用金山WPS,需要把代码中的 Word.Application 换成 Kwps.Application

代码:

from win32com.client import DispatchEx
import sys

soft = DispatchEx('Word.Application')

try:
    doc = soft.Documents.Open("wps源文件全路径")
    doc.SaveAs("生成word文档全路径", FileFormat=12)
    doc.Close()
except:
    print("错误信息:", sys.exc_info())

soft.Quit()

例如:

from win32com.client import DispatchEx
import sys

soft = DispatchEx('Word.Application')

try:
    doc = soft.Documents.Open("C:\\test\\20221020\\111.wps")
    doc.SaveAs("C:\\test\\20221020\\111.docx", FileFormat=12)
    doc.Close()
except:
    print("错误信息:", sys.exc_info())

soft.Quit()

(6)doc =》 docx

注意:

下面代码适用于微软Word,如果使用金山WPS,需要把代码中的 Word.Application 换成 Kwps.Application

代码:

from win32com.client import DispatchEx
import sys

soft = DispatchEx('Word.Application')

try:
    doc = soft.Documents.Open("doc源文件全路径")
    doc.SaveAs("生成docx文档全路径", FileFormat=12)
    doc.Close()
except:
    print("错误信息:", sys.exc_info())

soft.Quit()

例如:

from win32com.client import DispatchEx
import sys

soft = DispatchEx('Word.Application')

try:
    doc = soft.Documents.Open("C:\\test\\20221020\\222.doc")
    doc.SaveAs("C:\\test\\20221020\\222.docx", FileFormat=12)
    doc.Close()
except:
    print("错误信息:", sys.exc_info())

soft.Quit()

(7)pdf =》 docx

注意:

下面代码适用于Adobe Acrobat DC

代码:

from win32com.client.dynamic import ERRORS_BAD_CONTEXT
from win32com.client import DispatchEx

import sys
import winerror

# 必须加,不然就会出问题
ERRORS_BAD_CONTEXT.append(winerror.E_NOTIMPL)

# 打开Adobe Acrobat DC,其中使用DispatchEx()方法可以新开一个进程来做事情,避免影响已经打开的文件
soft = DispatchEx("AcroExch.AVDoc")

# 文件另存为
try:
    # 打开文档
    soft.Open("pdf源文件全路径", "")
    file = soft.GetPDDoc()
    jsObject = file.GetJSObject()
    # 另存为
    jsObject.SaveAs("生成docx文档全路径")
    file.Close()
except:
    print("错误信息:", sys.exc_info())
finally:
    # 退出软件
    soft.Close(True)

示例:

from win32com.client.dynamic import ERRORS_BAD_CONTEXT
from win32com.client import DispatchEx

import sys
import winerror

# 必须加,不然就会出问题
ERRORS_BAD_CONTEXT.append(winerror.E_NOTIMPL)

# 打开Adobe Acrobat DC,其中使用DispatchEx()方法可以新开一个进程来做事情,避免影响已经打开的文件
soft = DispatchEx("AcroExch.AVDoc")

# 文件另存为
try:
    # 打开文档
    soft.Open("C:\\test\\20220301\\智能提取服务接口文档.pdf", "")
    file = soft.GetPDDoc()
    jsObject = file.GetJSObject()
    # 另存为
    jsObject.SaveAs("C:\\test\\20220301\\智能提取服务接口文档.docx", "com.adobe.acrobat.docx")
    file.Close()
except:
    print("错误信息:", sys.exc_info())
finally:
    # 退出软件
    soft.Close(True)

四、pdf2docx实现文档转换

1、安装pdf2docx

具体细节请参阅三、pypiwin32实现文档转换1、安装pypiwin32,只不过需要搜索库名pdf2docx

2、文档转换

(1)pdf =》doc / docx

代码:

from pdf2docx import Converter

doc = Converter("pdf文件全路径")
doc.convert("生成word文档全路径", start=0, end=None)
doc.close()

例如:

from pdf2docx import Converter

doc = Converter("C:\\test\\20221020\\555.pdf")
doc.convert("C:\\test\\20221020\\555.docx", start=0, end=None)
doc.close()

五、生成exe(说明:执行exe不依赖任何python环境)

1、使用场景

虽然上面的代码都是demo代码,但是稍加改造就能完成我们的需求,目前我们公司需要将以wps结尾的文件转换成以docx结尾的文件,由于python可以把文件打成exe,然后生成的exe文件在任何电脑上都可以运行,并且不依赖于python环境,然后我们就可以使用其他语言(比如java)来调用exe完成工作

2、安装pyinstaller

pyinstaller是python使用的exe打包工具,建议在pycharm的终端输入pip3 install pyinstaller安装,安装之后可以通过pyinstaller命令检查安装效果,例如检查结果如下:

在这里插入图片描述

3、python代码

说明:

下面python代码都是基于上述demo改造的,以下代码可以通过命令行参数的形式把源文件和目标文件全路径传递到代码中,其他没做任何改变

wps2docx.py:

from win32com.client import DispatchEx
import sys

# 调用微软Word,其中使用DispatchEx()方法可以新开一个word进程来做事情,避免影响已经打开的word文件
soft = DispatchEx('Word.Application')

try:
    # 获取参数
    arg1 = sys.argv[1]

    # 参数分割
    urls = arg1.split("=")

    # 源文件
    source = urls[0]

    # 目标文件
    target = urls[1]

    # 文档转换
    doc = soft.Documents.Open(source)
    doc.SaveAs(target, FileFormat=12)
    doc.Close()
except:
    print("错误信息:", sys.exc_info())

# 软件退出
soft.Quit()

4、打包exe可执行文件

4.1、打包exe操作

命令:pyinstaller -F -w python文件相对路径/绝对路径,其中 -F 代表“打包成单个可执行文件”,-w 代表“当程序启动的时候不会打开命令行(仅对Windows有效)”;如果大家想定制exe文件图标,可以参考这篇文档 Python打包成exe文件_详细操作

例如:pyinstaller -F -w wps2docx.py

在这里插入图片描述

4.2、打包exe结果说明

在命令执行目录下面将会多出:build文件夹、dist文件夹、python文件名称.spec文件,例如:

在这里插入图片描述

其中exe可执行文件就在dist文件夹下面,当我们需要进行文档转换的时候,只需要在dist文件夹地址栏输入cmd回车,然后执行wps2docx.exe 源文件全路径=目标文件全路径即可

在这里插入图片描述
以后我们只要把build文件夹、dist文件夹、python文件名称.spec文件传给其他人,那么他们就可以使用exe文件来做事情了,我这里把我打包好的文件提供给大家,如下:

链接:https://pan.baidu.com/s/17k__R17guaFv7Eo41LXekQ?pwd=7sic

提取码:7sic

4.3、手动执行exe使用案例

按照4.2、exe打包结果说明,我们测试把C:\test\20221020\测试.wps转换成C:\test\20221020\转换结果.docx,首先我们需要进入dist文件夹,然后在控制栏输入cmd命令回车,然后输入下图指令即可:

在这里插入图片描述

操作结果如下:

在这里插入图片描述

5、使用java代码操作上述exe可执行文件

public class Test {
    public static void main(String[] args) throws IOException, InterruptedException {
        // exe可执行文件全路径
        String exe = "C:\\Users\\mingming\\PycharmProjects\\pythonProject\\dist\\wps2docx.exe";
        // 源文件全路径
        String source = "C:\\test\\20221020\\测试.wps";
        // 目标文件全路径
        String target = "C:\\test\\20221020\\转换结果.docx";
        // 组装命令,拼接空格的作用是让 可执行文件 和 参数 隔开
        String exeCommand = exe + " " + source + "=" + target;
        // 命令打印
        System.out.println("所用命令:" + exeCommand);
        // 执行exe
        Process process = Runtime.getRuntime().exec(exeCommand);
        process.waitFor();
    }
}

控制台输出:

所用命令:C:\Users\mingming\PycharmProjects\pythonProject\dist\wps2docx.exe C:\test\20221020\测试.wps=C:\test\20221020\转换结果.docx

6、拓展说明

虽然exe的名字叫做wps2docx.exe,但是支持wps、doc、docx转docx,毕竟只要目标格式不变,那么python程序中的FileFormat就不会变,然后就能转换成功

六、参考文章

  1. Python调用Win32com实现Office批量转PDF
  2. Python操作wps和et(WPS版的DOC和EXCEL)
  3. Python打包成exe文件_详细操作

7、拓展

;