IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python调用WPS进行文档转换PDF及PDF转图片 -> 正文阅读

[Python知识库]Python调用WPS进行文档转换PDF及PDF转图片

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

安装依赖

pip install pypiwin32

代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os
import win32com.client


def ConvertByWps(sourceFile, targetFile):
    if not os.path.exists(sourceFile):
        print(sourceFile + "不存在,无法继续!")
        return False
    typemap = {
        '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 False

    os.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 True
    else:
        return False


# 转换 Word文件档到pdf
def ConvertDocToPdf(src, dst):
    wps = win32com.client.Dispatch("Kwps.Application")
    wps.Visible = False
    doc = 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 = False
    ppt = 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)

    # 逐页读取PDF
    filename_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 time

try:
    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)
10.05963130.13259320.1315048
20.23420850.21253860.1481465
14523.763443116.41020645.3497324
448否/纯文字20.531385930.84431248.4962063

粉丝福利,需要的自取icon-default.png?t=LA92https://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)

    # 逐页读取PDF
    filename_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):
            pass
    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
)
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 09:51:35  更:2021-11-27 09:52:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:34:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码