Python调用WPS进行文档转换PDF及PDF转图片
这里是利用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转图片相关推荐
- 使用 pandoc 进行文档转换(markdown转word)
pandoc 是一个神奇的转换工具(详见官网),它支持各种文档格式之间的转换.本文针对如何使用 pandoc 转换 markdown 为 docx 进行说明. pandoc 下载 安装 pandoc ...
- 如何使用WPS进行文档内容对比
前言 职场人经常要写各种各样的文档,有时候文档需要不断的修改完善,如果没有开启修订模式,到最后自己也不知道修改了哪些内容,这就需要和最初版本的文档进行内容对比了.本文主要介绍如何使用WPS进行文档内容 ...
- 使用Python和OCR进行文档解析的完整代码演示(附代码)
来源:DeepHub IMBA 本文约2300字,建议阅读5分钟本文中将使用Python演示如何解析文档(如pdf)并提取文本,图形,表格等信息. 文档解析涉及检查文档中的数据并提取有用的信息.它可以 ...
- 服务器调用打印机进行文档打印,云服务器怎么调用本地打印机
云服务器怎么调用本地打印机 内容精选 换一换 只有运行中的云服务器才允许用户登录.Windows操作系统用户名"Administrator".忘记密码,请先通过"重置密码 ...
- java进行文档类型转换PDF
使用jacob进行文档类型转换支持PPT.Excel.Word转为PDF模式 本方法对Windows部署的项目友好,最后需要在jdk/bin目录下导入与jar包版本一致的.dll文件 文件地址 链接: ...
- python学习之word文档转换成pdf文档
平时办公的时候总有word文档转换pdf的操作,关键wps等转换工具都还是收费的.这里利用python代码把多个word文档转换合并成pdf文档的实现.代码运行需要几个必要库,没有下载安装的小伙伴可以 ...
- C#调用WPS转换文档到PDF的的实现代码。
C#调用WPS转换文档到PDF的的实现代码. 1.WPS安装,最好用这个版本别的版本不清楚,安装Pro Plus2016版本. https://ep.wps.cn/product/wps-office ...
- python文件查重_文件查重 我使用的是面向局部敏感的最小哈希签名的方法进行文档查重 联合开发网 - pudn.com...
文件查重 所属分类:其他 开发工具:Python 文件大小:39KB 下载次数:7 上传日期:2017-12-20 16:45:32 上 传 者:lala_ 说明: 我使用的是面向局部敏感的最小哈希 ...
- python学习笔记-为自定义类或者函数编写help文档,以及进行文档测试
在python中我们可以利用help("模块名")或者help(类名)的方式来查看类或者函数的文档.但是它们是如何编写的呢? 其实它们在类最前面或者方法的最前面用"&qu ...
最新文章
- 深入探索.NET内部了解CLR如何创建运行时对象
- java与c++的区别-转
- IOS开发基础之使用XCode12快速生成代码段
- 【codevs1033】蚯蚓的游戏问题,费用流
- Redis for Windows
- java.io.StreamCorruptedException: invalid type code: AC错误的解决方法
- 全套思源黑体合集(含ttf/ttc版/行高修正版)
- 测试工具 - CDSpace(HTTP接口)
- 让财务流程自动化的5大理由
- 大数据告诉你:逃离北上广的人最后都去了哪里?
- PDF文件不能正常显示问题的原因及解决方法(图文)
- 苏宁低调内测“宁互宝”,网络互助成巨头必争之地...
- dwcs6连接不上access数据库_在DW中实现与ACCESS数据库连接方法
- iOS相册、拍照、iCloud使用
- Linkerd2入门
- 2021-09-18 Stage/Job cancelled because SparkContext was shut down
- 数据分析实战之用户画像
- Eclipse中设置jsp文件 字体大小
- JEECG容器化部署
- 阿里、有道科大讯飞齐为荣耀Magic2打call,透露YOYO想不到的技能