这里是利用WPS进行转换,要先安装WPS。

安装依赖

pip install pypiwin32

代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-import os
import win32com.clientdef ConvertByWps(sourceFile, targetFile):if not os.path.exists(sourceFile):print(sourceFile + "不存在,无法继续!")return Falsetypemap = {'doc': 'word','docx': 'word','ppt': 'ppt','pptx': 'ppt','xls': 'excel','xlsx': 'excel',}name_arr = sourceFile.split(".")suffix = name_arr[len(name_arr) - 1]wpstype = typemap.get(suffix)if (wpstype is None):return Falseos.system('taskkill /im wps.exe')# 如果文件存在就删除if os.path.exists(targetFile):os.remove(targetFile)if wpstype == 'word':ConvertDocToPdf(sourceFile, targetFile)elif wpstype == 'ppt':ConvertPptToPdf(sourceFile, targetFile)elif wpstype == 'excel':ConvertXlsToPdf(sourceFile, targetFile)if os.path.exists(targetFile):return Trueelse:return False# 转换 Word文件档到pdf
def ConvertDocToPdf(src, dst):wps = win32com.client.Dispatch("Kwps.Application")wps.Visible = Falsedoc = wps.Documents.Open(src)doc.ExportAsFixedFormat(dst, 17)doc.Close()wps.Quit()# 转换 PPT文件档到pdf
def ConvertPptToPdf(src, dst):wps = win32com.client.Dispatch("Kwpp.Application")wps.Visible = Falseppt = wps.Presentations.Open(src)ppt.SaveAs(dst, 32)ppt.Close()wps.Quit()# 转换 XLS文件档到pdf
def ConvertXlsToPdf(src, dst):wps = win32com.client.Dispatch("Ket.Application")excel = wps.Workbooks.Open(src)excel.ExportAsFixedFormat(0, dst)excel.Close()wps.Quit()if __name__ == '__main__':# 当前目录d = os.path.dirname(__file__)abspath = os.path.abspath(d)# 测试用例src = abspath + r"/Doc/test.docx"dst = abspath + r"/Doc/test.pdf"r = ConvertByWps(src, dst)print(r)

PDF转图片

方式1

fitz

pip install fitz
pip install PyMuPDF

转换

import fitz
import os
import time# 将PDF转化为图片
# pdfPath pdf文件的路径
# imgPath 图像要保存的文件夹
# zoom_x x方向的缩放系数
# zoom_y y方向的缩放系数
# rotation_angle 旋转角度
def pdf_image(pdfPath, imgPath, zoom_x, zoom_y, rotation_angle):path_arr = pdfPath.split(os.sep)path_arr.reverse()filename = ""if(len(path_arr) > 0):filename = path_arr[0].split(".")[0]start_time = time.perf_counter()pdf = fitz.open(pdfPath)# 逐页读取PDFfilename_arr = []for pg in range(0, pdf.pageCount):page = pdf[pg]# 设置缩放和旋转系数trans = fitz.Matrix(zoom_x, zoom_y).prerotate(rotation_angle)pm = page.get_pixmap(matrix=trans, alpha=False)# 开始写图像filename_all = f'{imgPath}{os.sep}{filename}_{str(pg)}.png'pm.save(filename_all)filename_arr.append(filename_all)pdf.close()end_time = time.perf_counter()print(f"时间差:{end_time-start_time}")print(len(filename_arr))pdf_image(r"D:\Tools\DocTest\145页.pdf",r"D:\Tools\DocTest\pic",2,2,0
)

方式2

安装poppler

Poppler for Windows

添加bin对应目录到环境变量

注意

如果调用方法传入poppler_path参数,则不用设置环境变量。

https://github.com/Belval/pdf2image

安装依赖

pip install pdf2image

转换代码

from pdf2image import convert_from_path, convert_from_bytes
from pdf2image.exceptions import (PDFInfoNotInstalledError,PDFPageCountError,PDFSyntaxError
)
import timetry:start_time = time.perf_counter()images = convert_from_path(r"D:\Tools\DocTest\145页.pdf",output_folder=r"D:\Tools\DocTest\pic",poppler_path=r"D:\Tools\poppler-0.67.0\bin",size=(1024, None),thread_count=4,timeout=60,fmt='jpeg')end_time = time.perf_counter()print(f"时间差:{end_time-start_time}")print(images[0])
except PDFInfoNotInstalledError:print("未安装poppler")
except PDFPageCountError:print("页面异常")
except PDFSyntaxError:print("PDF页面异常")
except:print("其它异常")

转换时间对比

PDF页数 是否带水印 方式1(s) 方式2(s) 方式2-4线程(s)
1 0.0596313 0.1325932 0.1315048
2 0.2342085 0.2125386 0.1481465
145 23.7634431 16.4102064 5.3497324
448 否/纯文字 20.5313859 30.8443124 8.4962063

粉丝福利,需要的自取https://docs.qq.com/pdf/DR3dMaE1CSkZ6RlBZ

结论

  • 转换速度方式2在页面少的时候时间稍长,但是一旦页码多的时候方式2优势就比较明显。
  • 两种都能正常转换带水印的文档。
  • 如果文档都是纯文字GBK的时候,方式1转换正常,而方式2乱码。

方式1我切换为多线程依旧作用不大

import fitz
import os
import time
from concurrent import futures
import threading# 将PDF转化为图片
# pdfPath pdf文件的路径
# imgPath 图像要保存的文件夹
# zoom_x x方向的缩放系数
# zoom_y y方向的缩放系数
# rotation_angle 旋转角度
def pdf_image(pdfPath, imgPath, zoom_x, zoom_y, rotation_angle):path_arr = pdfPath.split(os.sep)path_arr.reverse()filename = ""if(len(path_arr) > 0):filename = path_arr[0].split(".")[0]start_time = time.perf_counter()pdf = fitz.open(pdfPath)# 逐页读取PDFfilename_arr = []pages = []def savePage(pageobj):print(threading.current_thread().name)page = pageobj["page"]pg = pageobj["pg"]# 设置缩放和旋转系数trans = fitz.Matrix(zoom_x, zoom_y).prerotate(rotation_angle)pm = page.get_pixmap(matrix=trans, alpha=False)# 开始写图像filename_all = f'{imgPath}{os.sep}{filename}_{str(pg)}.png'pm.save(filename_all)filename_arr.append(filename_all)for pg in range(0, pdf.pageCount):page = pdf[pg]pages.append({"page": page,"pg": pg})print(len(pages))with futures.ThreadPoolExecutor(max_workers=8) as executor:for future in executor.map(savePage, pages):passpdf.close()end_time = time.perf_counter()print(f"时间差:{end_time-start_time}")print(len(filename_arr))pdf_image(r"D:\Tools\DocTest\145页.pdf",r"D:\Tools\DocTest\pic",2,2,0
)

Python调用WPS进行文档转换PDF及PDF转图片相关推荐

  1. 使用 pandoc 进行文档转换(markdown转word)

    pandoc 是一个神奇的转换工具(详见官网),它支持各种文档格式之间的转换.本文针对如何使用 pandoc 转换 markdown 为 docx 进行说明. pandoc 下载 安装 pandoc ...

  2. 如何使用WPS进行文档内容对比

    前言 职场人经常要写各种各样的文档,有时候文档需要不断的修改完善,如果没有开启修订模式,到最后自己也不知道修改了哪些内容,这就需要和最初版本的文档进行内容对比了.本文主要介绍如何使用WPS进行文档内容 ...

  3. 使用Python和OCR进行文档解析的完整代码演示(附代码)

    来源:DeepHub IMBA 本文约2300字,建议阅读5分钟本文中将使用Python演示如何解析文档(如pdf)并提取文本,图形,表格等信息. 文档解析涉及检查文档中的数据并提取有用的信息.它可以 ...

  4. 服务器调用打印机进行文档打印,云服务器怎么调用本地打印机

    云服务器怎么调用本地打印机 内容精选 换一换 只有运行中的云服务器才允许用户登录.Windows操作系统用户名"Administrator".忘记密码,请先通过"重置密码 ...

  5. java进行文档类型转换PDF

    使用jacob进行文档类型转换支持PPT.Excel.Word转为PDF模式 本方法对Windows部署的项目友好,最后需要在jdk/bin目录下导入与jar包版本一致的.dll文件 文件地址 链接: ...

  6. python学习之word文档转换成pdf文档

    平时办公的时候总有word文档转换pdf的操作,关键wps等转换工具都还是收费的.这里利用python代码把多个word文档转换合并成pdf文档的实现.代码运行需要几个必要库,没有下载安装的小伙伴可以 ...

  7. C#调用WPS转换文档到PDF的的实现代码。

    C#调用WPS转换文档到PDF的的实现代码. 1.WPS安装,最好用这个版本别的版本不清楚,安装Pro Plus2016版本. https://ep.wps.cn/product/wps-office ...

  8. python文件查重_文件查重 我使用的是面向局部敏感的最小哈希签名的方法进行文档查重 联合开发网 - pudn.com...

    文件查重 所属分类:其他 开发工具:Python 文件大小:39KB 下载次数:7 上传日期:2017-12-20 16:45:32 上 传 者:lala_ 说明:  我使用的是面向局部敏感的最小哈希 ...

  9. python学习笔记-为自定义类或者函数编写help文档,以及进行文档测试

    在python中我们可以利用help("模块名")或者help(类名)的方式来查看类或者函数的文档.但是它们是如何编写的呢? 其实它们在类最前面或者方法的最前面用"&qu ...

最新文章

  1. 深入探索.NET内部了解CLR如何创建运行时对象
  2. java与c++的区别-转
  3. IOS开发基础之使用XCode12快速生成代码段
  4. 【codevs1033】蚯蚓的游戏问题,费用流
  5. Redis for Windows
  6. java.io.StreamCorruptedException: invalid type code: AC错误的解决方法
  7. 全套思源黑体合集(含ttf/ttc版/行高修正版)
  8. 测试工具 - CDSpace(HTTP接口)
  9. 让财务流程自动化的5大理由
  10. 大数据告诉你:逃离北上广的人最后都去了哪里?
  11. PDF文件不能正常显示问题的原因及解决方法(图文)
  12. 苏宁低调内测“宁互宝”,网络互助成巨头必争之地...
  13. dwcs6连接不上access数据库_在DW中实现与ACCESS数据库连接方法
  14. iOS相册、拍照、iCloud使用
  15. Linkerd2入门
  16. 2021-09-18 Stage/Job cancelled because SparkContext was shut down
  17. 数据分析实战之用户画像
  18. Eclipse中设置jsp文件 字体大小
  19. JEECG容器化部署
  20. 阿里、有道科大讯飞齐为荣耀Magic2打call,透露YOYO想不到的技能

热门文章

  1. element-ui dialog遮罩层在最上层,关掉dialog遮罩层还在
  2. 消失的两个数字(1~N缺两个数)
  3. 大数据处理系统都有哪些?(数据查询分析计算系统篇)
  4. 蓝屏终止代码:WHEA_UNCORRECTABLE_ERROR
  5. 《网络协议》笔记-网络分层
  6. Java - HuTool 使用 EscapeUtil、XmlUtil等工具类(四)
  7. 区块链的大问题有救了!
  8. scrollTo滚动到指定位置或指定元素的位置、平滑滚动,以及offsetTop的使用
  9. 如何设定打开页面的大小
  10. 【愚公系列】2021年12月 Typescript-数组和元组和CSV