网上现在基于python代码实现word转pdf的方法,基本都是依赖于micro office。然后我找了一大圈之后,确实也没有别的完全不依赖外部就能实现word2pdf。但是也找到有一个比微软office友好的方案。就是 LibreOffice,他的优点是:

  1. 完全开源,没有任何使用限制,商业使用也没有限制
  2. 安装比微软office简单,安装包也小一点

当然,缺点也是有的,就是转换并不能完全保持格式不变,这点可能就能让很多人放弃他了。。。

但是不管怎么样,我也需要一种有别于微软office 的方案。

实现

LibreOffice虽说国内也有站点,但是资料是真的不多,特别是关于编程开发这块的,api的使用也很不人性化。所以,我从0 到整出来代码,花了两天。。。很痛苦。

但是整出来的代码并不可用呀,毕竟都是看的很老的资料了。
首选官方论坛提供了一种方法:api调用,但是这种方法他依赖于时候用libre自带的python,不能使用本地的python,这怎么能忍,所以四处搜索别的方法,于是在libre的大哥“openOffice”论坛上找到一些方法:python+COM桥
这里提供的方法可以使用本地python调用libre。于是我整合各方代码,写出了以下代码:

import win32com.clientOO_ServiceManager = win32com.client.DispatchEx("com.sun.star.ServiceManager")
desktop = OO_ServiceManager.CreateInstance("com.sun.star.frame.Desktop")
OO_ServiceManager._FlagAsMethod("Bridge_GetStruct")def createProp(name, value):prop = OO_ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")prop.Name = nameprop.Value = valuereturn proploading_properties=[]
# loading_properties.append(createProp("ReadOnly",True))
# loading_properties.append(createProp("Hidden",True))
filepath = "file:///%s" % r"C:\workSpace\python\word2pdf\test.docx"document = desktop.loadComponentFromUrl(filepath, "_blank", 0, tuple(loading_properties))
# document.CurrentController.Frame.ContainerWindow.Visible = False
pdf_properties = []
pdf_properties.append(createProp("FilterName", "writer_pdf_Export"))newpath = filepath[:-len("docx")] + "pdf"try:document.storeToURL(newpath, pdf_properties)  # Export
except Exception:raise
try:document.close(True)
except Exception:raise

运行代码的前提当然是安装了LibreOffice,然后运行,首先能,不开“readOnly”和“hidden”模式去读取报告的时候,它会弹出可视化界面,会报这个错:

然后点通知呢,就能以可读的方式打开对应的word(这里可能需要time.sleep一下,否则这个窗口没多久可能就会自己关闭),所以呀,折腾了两天的代码,好歹看到了文档可以被打开,还是感觉到离成功不远了。
等这个窗口关闭之后,控制台还会输出错误:

Traceback (most recent call last):File "C:\workSpace\python\word2pdf\test2.py", line 26, in <module>document.storeToURL(newpath, pdf_properties)  # ExportFile "<COMObject <unknown>>", line 2, in storeToURL
pywintypes.com_error: (-2147352567, '发生意外。', (1001, '[automation bridge] ', 'com.sun.star.io.IOException: SfxBaseModel::impl_store <file:///C:\\workSpace\\python\\word2pdf\\test.pdf> failed: 0x507(Error Area:Io Class:Access Code:7)', None, 0, 0), None)

于是追着两个错误,查资料,看文档和代码,在安装包的“\libreoffice-7.2.5.2\include\vcl\errcode.hxx”文件中,可以看到错误代码7表示:“Locking”,就认为是权限问题:

除了权限问题,我当时就还怀疑是我的路径写的有问题,当然因为文档确实也被打开了,所以也不是很怀疑是路径的问题。追着权限问题查了一天。但是实在是没有结果。于是想放弃。

但是还不甘心,就想着先用它自带的那个python跑一下,看能不能实现,于是我跑了api调用的代码
,没出意外,它和我报的一样的错误。到这里,是真的想放弃了。

但是难受了三天,还是挣扎了一下,最后再百度搜了这篇,替换了“”api调用“”的那份代码,只是将他的文件路径改成我的。神奇的是他居然没报错!!!

然后马上查为什么,对比了下来,就发现路径那里的写法不一样:

filepath = r"C:\Users\JimStandard\Desktop\Untitled 1.docx"
fileUrl = uno.systemPathToFileUrl(os.path.realpath(filepath))

他的路径是用libre的转换函数转换出来的,于是就print出来,乍一看,没发现什么不同,但是仔细对比,它的路径用的反斜杠“/”,而我的是“\”!然后马上改了自己的代码,它真的就可以了!!!

但是为什么我那样写它也能打开文档来!!!

好吧,是自己细节不好,没注意到这个地方,花了一整天。

PS:其实API调用那篇也没有问题的,只是人家那是Linux下的实现。

最后贴一下完整的代码:

import win32com.client# 调用程序
OO_ServiceManager = win32com.client.DispatchEx("com.sun.star.ServiceManager")
desktop = OO_ServiceManager.CreateInstance("com.sun.star.frame.Desktop")
OO_ServiceManager._FlagAsMethod("Bridge_GetStruct")# 生成参数元祖
def createProp(name, value):prop = OO_ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")prop.Name = nameprop.Value = valuereturn prop#读取文档的参数
loading_properties=[]
loading_properties.append(createProp("ReadOnly",True)) # 以只读方式打开
loading_properties.append(createProp("Hidden",True)) # 隐藏可视化界面,只是隐藏,还是加载了资源的
filepath = "file:///%s" % r"C:/workSpace/python/word2pdf/test.docx" # 绝对路径,注意反斜杠document = desktop.loadComponentFromUrl(filepath, "_blank", 0, tuple(loading_properties))
document.CurrentController.Frame.ContainerWindow.Visible = False # 据说这样就不会加载可视化界面了,可是放在这个位置都已经加载完成了呀!先放着吧
#转换为pdf的参数
pdf_properties = []
pdf_properties.append(createProp("FilterName", "writer_pdf_Export"))newpath = filepath[:-len("docx")] + "pdf" # pdf 保存路径和名称try:document.storeToURL(newpath, pdf_properties)  # 转换输出
except Exception:raise
try:document.close(True) # 关闭
except Exception:raise

这里只是初级目标,我想的是,将libreOffice精简,然后整成一个很小的包,不然几百兆的安装包,还是挺烦人的。

使用LibreOffice实现word转pdf(python代码)相关推荐

  1. 借助 libreoffice,word 转 pdf 体验

    libreoffice 官网 https://zh-cn.libreoffice.org/ 软件下载镜像: https://mirrors.cloud.tencent.com/libreoffice/ ...

  2. PHP使用LibreOffice实现word转pdf

    PHP使用LibreOffice实现word转pdf 一.windows下的安装及使用 1. 下载并安装<LibreOffice 便携版> 2. 通过cmd命令实现文档转换 3.php调用 ...

  3. 利用LibreOffice进行WORD转PDF

    常用解决方案: 收费,不介绍. 免费,利用OpenOffice或者LibreOffice等进行转化,但是转化效率稍微慢点,但是word格式保持不错. POI+itext,网上也有不少,但是没有真正研究 ...

  4. 使用LibreOffice在线word转换pdf

    相关资料 Windows安装包:LibreOffice_7.0.6_Win_x64.msi Linux(CentOs)安装包:LibreOffice_7.0.6_Linux_x86-64_rpm.zi ...

  5. nestjs 结合LibreOffice 实现word转pdf在线预览

    一.下载-并安装LibreOffice 下载地址:https://zh-cn.libreoffice.org/download/libreoffice/ 下载后安装并配置环境变量 打开新的cmd窗口, ...

  6. LibreOffice实现word转pdf

    1,下载安装LibreOffice(根据系统下载对应版本),这里提供windows64的版本(LibreOffice_6.2.8_Win_x64.msi) https://download.csdn. ...

  7. python 3.8.5 打包_python做个word转pdf的小软件

    点击上方蓝字,一起在代码的世界遨游 135编辑器 好久没更新了,因为最近学校这边事情有点多.不过这两天还是花了点时间,陆陆续续将代码和这篇文章写出来.写这个例子其实是最近需要用到几次word转为pdf ...

  8. 使用 LibreOffice 将 word 转化为 pdf 并解决中文乱码问题

    目录 一.安装 LibreOffice 二.解决乱码问题 2.1 查看是否安装中文字体 2.2 准备字体 2.3 导入字体 2.4 验证 项目中有一个在线上传 word 并预览 pdf 报告的需求,因 ...

  9. 后台实现word转pdf输出文件流

    首先需要安装好LibreOffice,支持免费使用,安装包太大没法上传,可以去官网下载:https://zh-cn.libreoffice.org/download/download/ 根据系统选择需 ...

  10. c html转换成word,C#实现HTML转WORD及WORD转PDF的方法

    本文实例讲述了C#实现HTML转WORD及WORD转PDF的方法.分享给大家供大家参考.具体如下: 功能:实现HTML转WORD,WORD转PDF 具体代码如下: using System; usin ...

最新文章

  1. 获取DataRow某列的值的封装
  2. 健康饮食动起来[我写绿色IT]
  3. java中capitals,Java GlobalConfiguration.isCapitalMode方法代码示例
  4. 易遭黑客利用,慎用免费的网站SSL证书!!!
  5. php按时间归档,PHP文章按日期(月日)SQL归档
  6. mybatis list为入参_Mybatis进阶学习
  7. android调用web接口,Android调用WebService系列之请求调用
  8. 通过Socket configuration controls 获取网络设备地址
  9. Android SDK的下载与安装(包会)
  10. 测试金士顿固态硬盘软件,金士顿固态硬盘管理工具(Kingston SSD Manager)
  11. 计算机光盘无法格式化,怎么格式化光盘啊??求解!!
  12. 怎么用计算机创建wifi,电脑如何设置wifi
  13. CentOS 6 安装免费虚拟主机控制面板ZPanel
  14. MySQL当前读和快照读
  15. Windows系统资源监控工具perfmon
  16. Invalid topo name mytopo
  17. 问题 C: 小写转大写
  18. ppt不能保存我html,powerpoint无法保存怎么解决
  19. 扩展ACL ---王贝的学习笔记
  20. 中软外包创维面试,尬聊半小时

热门文章

  1. Specification 对象的常用方法
  2. mysql查询姓名第二个字_第二篇:MySQL中SELECT查询语句总结
  3. 谷歌工程师深度技术分析“为什么ios比android流畅
  4. [linux]记录内核编译日志
  5. r语言svr模型_基于ARIMA,SVR组合模型的空气质量指数预测——以济南为例
  6. 【Javascript】入门之QQ列表的实现
  7. 纯CSS实现正方体旋转效果
  8. [BFS]愿天下有情人都是失散多年的兄妹
  9. 爱国者p8880e java_口袋里的电脑 爱国者P8880E MID评测
  10. LDAP学习小结【仅原理和基础篇】