使用python将word文档和pdf电子书进行格式互转(兼容Windows/Linux)

简介: 一些重要文档格式之间的互转在目前显得尤为重要,pdf作为通用格式在现在各个平台上兼容性是最好的,所以写python脚本将这些word文档批量转换pdf是最好的解决方案。由于windows系统对于word文档有天然的兼容性优势,所以转换起来很简单,普遍上是通过comtypes模块。

一些重要文档格式之间的互转在目前显得尤为重要,pdf作为通用格式在现在各个平台上兼容性是最好的,所以写python脚本将这些word文档批量转换pdf是最好的解决方案。

由于windows系统对于word文档有天然的兼容性优势,所以转换起来很简单,普遍上是通过comtypes模块。

pip3 install comtypes
from comtypes.client import CreateObject
import os

def wd_to_pdf(folder):
        #获取指定目录下面的所有文件
        files = os.listdir(folder)
        #获取word类型的文件放到一个列表里面
        wdfiles = [f for f in files if f.endswith((".doc", ".docx"))]
        for wdfile in wdfiles:
            #将word文件放到指定的路径下面
            wdPath = os.path.join(folder, wdfile)
            #设置将要存放pdf文件的路径
            pdfPath = wdPath
            #判断是否已经存在对应的pdf文件,如果不存在就加入到存放pdf的路径内
            if pdfPath[-3:] != 'pdf':
                pdfPath = pdfPath + ".pdf"
            #将word文档转化为pdf文件,先打开word所在路径文件,然后在处理后保存pdf文件,最后关闭
            pdfCreate = self.wdToPDF.Documents.Open(wdPath)
            pdfCreate.SaveAs(pdfPath, self.wdFormatPDF)

其实难点还是在Linux系统下如何转换,因为comtypes依赖的win32com模块在linux下是无法使用的,所以在linux下面推荐另外一套解决方案也就是LibreOffice,LibreOffice 能够与 Microsoft Office 系列以及其它开源办公软件深度兼容,且支持的文档格式相当全面。

首先卸载当前系统的libreoffice,因为大多数系统默认安装的都是低版本,我们要使用的是最新稳定版

yum remove libreoffice-*

https://www.libreoffice.org/download/download/上下载最新的稳定版gz压缩包

安装java依赖

yum -y install java-1.8.0-openjdk*

然后将刚才下载的gz压缩包解压后安装

tar xvf LibreOffice_6.2.5.2_Linux_x86-64_rpm.tar.gz
 
cd LibreOffice_6.2.5.2_Linux_x86-64_rpm/RPMS/
 
yum localinstall *.rpm

最后安装一些依赖

yum install cairo cups-libs libSM
yum install ibus
yum install libreoffice-headless

在命令行输入

libreoffice -help

会显示帮助文档就没问题了

解决中文乱码问题

安装windows字体(不装,会有乱码)将windows的字体复制到linux上C:WindowsFonts* windows上所有的字体(尝试过只复制部分,还是有乱码,全部字体就不会乱码了),上传到linux的/usr/share/fonts/chinese('chinese'目录是我自己建的,mkdir chinese)

chmod -R 755 /usr/share/fonts/chinese    // 修改权限

fc-cache -fv        // 建立字体缓存

fc-list | grep chinese        // 可以查看到已安装新增的字体了

如果你嫌麻烦,也可以修改系统语言来支持中文

执行命令:

yum groupinstall "fonts"

安装成功后,

打开

vim /etc/locale.conf

按键 i 进入编辑模式, 把内容改为

LANG="zh_CN.UTF-8"

wq 存盘

然后重启服务器reboot

之后也可以支持中文转换了

转换命令

libreoffice6.2 --headless --convert-to pdf /root/4321.docx

此时,我们要改造一下转换脚本,做到可以兼容windows和Linx双系统,任意系统下都可以调用脚本进行转换

import subprocess
import os
try:
    from comtypes import client
except ImportError:
    client = None

def doc2pdf(doc):
    """
    convert a doc/docx document to pdf format
    :param doc: path to document
    """
    doc = os.path.abspath(doc) # bugfix - searching files in windows/system32
    if client is None:
        return doc2pdf_linux(doc)
    name, ext = os.path.splitext(doc)
    try:
        word = client.DispatchEx("Word.Application")
        worddoc = word.Documents.Open(doc)
        worddoc.SaveAs(name + '.pdf', FileFormat=17)
    except Exception:
        raise
    finally:
        worddoc.Close()
        word.Quit()


def doc2pdf_linux(doc):
    """
    convert a doc/docx document to pdf format (linux only, requires libreoffice)
    :param doc: path to document
    """
    cmd = 'libreoffice6.2 --headless --convert-to pdf'.split() + [doc]
    p = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    p.wait(timeout=10)
    stdout, stderr = p.communicate()
    if stderr:
        raise subprocess.SubprocessError(stderr)

简直完美,可以收工了

相关文章
|
6天前
|
安全 Ubuntu Linux
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
27 9
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
|
2月前
|
Ubuntu 安全 Linux
|
6天前
|
自然语言处理 安全 Java
Nexpose 7.0.1 for Linux & Windows - 漏洞扫描
Nexpose 7.0.1 for Linux & Windows - 漏洞扫描
30 6
|
9天前
|
关系型数据库 MySQL Linux
MySQL数据库下载安装教程(Windows&Linux)
本文档详细介绍了MySQL的安装步骤,包括安装前的准备工作、下载安装包、Windows和Linux系统下的具体安装流程,以及如何配置MySQL服务、设置环境变量、启动服务和连接数据库等关键操作。
|
22天前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
49 4
|
2月前
|
Linux 网络安全 虚拟化
适用于Linux的Windows子系统(WSL1)的安装与使用记录
并放到启动文件夹,就可以开机自动启动了。
65 0
|
2月前
|
关系型数据库 MySQL Linux
Navicat 连接 Windows、Linux系统下的MySQL 各种错误,修改密码。
使用Navicat连接Windows和Linux系统下的MySQL时可能遇到的四种错误及其解决方法,包括错误代码2003、1045和2013,以及如何修改MySQL密码。
251 0
|
4月前
|
Ubuntu Linux 虚拟化
安装Windows Linux 子系统的方法:适用于windows 11 版本
本文提供了在Windows 11系统上安装Linux子系统(WSL)的详细步骤,包括启用子系统和虚拟化功能、从Microsoft Store安装Linux发行版、设置WSL默认版本、安装WSL2补丁,以及完成Ubuntu的首次安装设置。
1164 2
|
7月前
|
Linux Windows Ubuntu
Windows 使用 Linux 子系统,轻轻松松安装多个linux
Windows 使用 Linux 子系统,轻轻松松安装多个linux
665 0
Windows 使用 Linux 子系统,轻轻松松安装多个linux
|
7月前
|
存储 Ubuntu 关系型数据库
在Windows WSL (Linux的Windows子系统)上运行的Ubuntu 20.04安装Bacula失败
Bacula 是一个开源的跨平台网络备份工具,提供基于客户端/服务器(CS)架构的企业级备份解决方案。它支持对数据进行备份、恢复以及完整性校验,并且可以运行在多种操作系统上,包括 Windows 和 Linux 等。
86 0