Python实现PDF转换文件格式

news2024/11/23 21:29:26

最近工作中经常遇到收到其他人提供的pdf文档,想要编辑修改下或者复制部分内容比较困难,想通过现有的pdf工具软件转换文档格式,基本都要充钱,为了免费实现pdf转换工具,网上查了下相关技术方案,整理了下代码,测试真实有效,分享下。

第一步,安装相关第三方库

pip install PyMuPDF -i https://mirrors.aliyun.com/pypi/simple
pip install pdf2docx -i https://mirrors.aliyun.com/pypi/simple

第二步,编写代码

pdfConverter.py:

import datetime
import os
# fitz就是pip install PyMuPDF
import fitz
# pdf2docx 也是封装 fitz 模块为基础开发的
from pdf2docx import Converter

'''
pdf 转换工具包
pdf 转成 word
pdf 转成 图片
pdf 转成 html
'''


def pdf2word(file_path):
    '''
    @方法名称: pdf转word
    @中文注释: pdf转word
    @入参:
        @param file_path str pdf文件路径
    @出参:
        @返回状态:
            @return 0 失败或异常
            @return 1 成功
        @返回错误码
        @返回错误信息
        @param doc_file str word文件名
    @作    者: PandaCode辉
    @创建时间: 2023-10-16
    @使用范例: pdf2word('test.pdf')
    '''
    try:
        if (not type(file_path) is str):
            return [0, "111111", "pdf文件路径参数类型错误,不为字符串", [None]]
        # 开始时间
        startTime = datetime.datetime.now()
        # 提取文件名,去除文件后缀
        file_name = file_path.split('.')[0]
        print(file_name)
        # word文件名
        doc_file = f'{file_name}.docx'
        print(doc_file)
        p2w = Converter(file_path)
        '''
        convert(doc_file,start,end)函数中
        doc_file:转化完成后文件名
        start:转化开始页面
        end:转化结束页面
        注意点:
        ①若不给start,end参数则默认转化全篇
        ②对于不连续的页面,也可写作convert(doc_file , pages = [2,4,6])
        '''
        p2w.convert(doc_file, start=0, end=None)
        p2w.close()
        endTime = datetime.datetime.now()  # 结束时间
        print('pdf转word耗时: %s 秒' % (endTime - startTime).seconds)
        print("pdf转word成功")
        # 返回容器
        return [1, '000000', 'pdf转word成功', [doc_file]]

    except Exception as e:
        p2w.close()
        print("pdf转word异常," + str(e))
        return [0, '999999', "pdf转word异常," + str(e), [None]]


def pdf2image(file_path, image_path):
    '''
    @方法名称: pdf转图片
    @中文注释: pdf转图片
    @入参:
        @param file_path str pdf文件路径
        @param image_path str 输出图片路径
    @出参:
        @返回状态:
            @return 0 失败或异常
            @return 1 成功
        @返回错误码
        @返回错误信息
        @param image_path str 输出图片路径
    @作    者: PandaCode辉
    @创建时间: 2023-10-16
    @使用范例: pdf2image('test.pdf', './images')
    '''
    try:
        if (not type(file_path) is str):
            return [0, "111111", "pdf文件路径参数类型错误,不为字符串", [None]]
        if (not type(image_path) is str):
            return [0, "111112", "输出图片路径参数类型错误,不为字符串", [None]]
        # 开始时间
        startTime = datetime.datetime.now()
        print("pdfPath=" + file_path)
        # 提取文件名,去除文件后缀
        file_name = file_path.split('.')[0]
        print(file_name)
        print("imagePath=" + imagePath)
        # 打开pdf文档
        pdfDoc = fitz.open(file_path)
        # 判断存放图片的文件夹是否存在
        if not os.path.exists(image_path):
            # 若图片文件夹不存在就创建
            os.makedirs(image_path)
        # Document.page_count	页数 (int)
        # 循环页数
        for pg in range(pdfDoc.page_count):
            print('=======%s========' % (pg + 1))
            '''
            页面(Page)处理是MuPDF功能的核心。
            您可以将页面呈现为光栅或矢量(SVG)图像,可以选择缩放、旋转、移动或剪切页面。
            您可以提取多种格式的页面文本和图像,并搜索文本字符串。
            对于PDF文档,可以使用更多的方法向页面添加文本或图像。
            '''
            page = pdfDoc[pg]
            rotate = int(0)
            # 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。
            # 此处若是不做设置,默认图片大小为:792X612, dpi=96
            zoom_x = 1.33333333  # (1.33333333-->1056x816)   (2-->1584x1224)
            zoom_y = 1.33333333
            mat = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
            '''
            pix是一个Pixmap对象,它(在本例中)包含页面的RGB图像,可用于多种用途。
            方法Page.get_pixmap()提供了许多用于控制图像的变体:分辨率、颜色空间(例如,生成灰度图像或具有减色方案的图像)、
            透明度、旋转、镜像、移位、剪切等。        
            例如:创建RGBA图像(即,包含alpha通道),指定pix=page.get_pixmap(alpha=True)。        
            Pixmap包含以下引用的许多方法和属性。其中包括整数宽度、高度(每个像素)和跨距(一个水平图像行的字节数)。
            属性示例表示表示图像数据的矩形字节区域(Python字节对象)。        
            还可以使用page.get_svg_image()创建页面的矢量图像。
            '''
            pix = page.get_pixmap(matrix=mat, alpha=False)
            # 将图片写入指定的文件夹内
            pix.save(image_path + '/' + file_name + '_%s.png' % (pg + 1))
        endTime = datetime.datetime.now()  # 结束时间
        print('pdf转图片耗时: %s 秒' % (endTime - startTime).seconds)
        print("pdf转图片成功")
        # 返回容器
        return [1, '000000', '"pdf转图片成功', [image_path]]

    except Exception as e:
        print("pdf转图片异常," + str(e))
        return [0, '999999', "pdf转图片异常," + str(e), [None]]


def pdf2html(file_path):
    '''
    @方法名称: pdf转html
    @中文注释: pdf转html
    @入参:
        @param file_path str pdf文件路径
    @出参:
        @返回状态:
            @return 0 失败或异常
            @return 1 成功
        @返回错误码
        @返回错误信息
        @param out_file str html文件名
    @作    者: PandaCode辉
    @创建时间: 2023-10-16
    @使用范例: pdf2html('test.pdf')
    '''
    try:
        if (not type(file_path) is str):
            return [0, "111111", "pdf文件路径参数类型错误,不为字符串", [None]]
        # 开始时间
        startTime = datetime.datetime.now()
        print("pdfPath=" + pdfPath)
        # 打开pdf文档
        pdfDoc = fitz.open(pdfPath)
        # 提取文件名,去除文件后缀
        file_name = pdfPath.split('.')[0]
        print(file_name)
        out_file = f'{file_name}.html'
        print(out_file)
        # 打开文件,首次创建写入
        fo = open(out_file, "w+", encoding="utf-8")
        # Document.page_count	页数 (int)
        # 循环页数
        for pg in range(pdfDoc.page_count):
            print('=======%s========' % (pg + 1))
            '''
            页面(Page)处理是MuPDF功能的核心。
            您可以将页面呈现为光栅或矢量(SVG)图像,可以选择缩放、旋转、移动或剪切页面。
            您可以提取多种格式的页面文本和图像,并搜索文本字符串。
            对于PDF文档,可以使用更多的方法向页面添加文本或图像。
            '''
            page = pdfDoc[pg]
            '''
            提取文本和图像 page.get_text(opt) 
                我们还可以以多种不同的形式和细节级别提取页面的所有文本、图像和其他信息:
                对opt使用以下字符串之一以获取不同的格式:
                "text":(默认)带换行符的纯文本。无格式、无文字位置详细信息、无图像
                "blocks":生成文本块(段落)的列表
                "words":生成单词列表(不包含空格的字符串)
                "html":创建页面的完整视觉版本,包括任何图像。这可以通过internet浏览器显示
                "dict" / "json":与HTML相同的信息级别,但作为Python字典或resp.JSON字符串。
                "rawdict" / "rawjson":"dict" / "json"
                的超级集合。它还提供诸如XML之类的字符详细信息。
                "xhtml":文本信息级别与文本版本相同,但包含图像。
                "xml":不包含图像,但包含每个文本字符的完整位置和字体信息。使用XML模块进行解释
            '''
            # html 格式保存原PDF文本和图片样式还行
            # text = page.get_text('html')
            # xhtml 格式保存原PDF文本和图片样式更好
            text = page.get_text('xhtml')
            # 写入文件
            fo.write(text)
        # 关闭文件
        fo.close()
        endTime = datetime.datetime.now()  # 结束时间
        print('pdf转html耗时: %s 秒' % (endTime - startTime).seconds)
        print("pdf转html成功")
        # 返回容器
        return [1, '000000', '"pdf转html成功', [out_file]]

    except Exception as e:
        # 关闭文件
        fo.close()
        print("pdf转html异常," + str(e))
        return [0, '999999', "pdf转html异常," + str(e), [None]]


if __name__ == "__main__":
    # PDF地址
    pdfPath = 'test.pdf'

    # 1,pdf转word
    pdf2word(pdfPath)

    # 储存图片的目录
    imagePath = './images'
    # 2,pdf转图片
    pdf2image(pdfPath, imagePath)

    # 3,pdf转html
    pdf2html(pdfPath)

第三步,运行查看效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1098191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【EI会议征稿】第三届高性能计算与通信工程国际学术会议(HPCCE 2023)

第三届高性能计算与通信工程国际学术会议(HPCCE 2023) 第三届高性能计算与通信工程国际学术会议(HPCCE 2023)将于2023年12月22-24日在长沙召开。HPCCE 2023将围绕“高性能计算与通信工程”的最新研究领域,为来自国内外高等院校、科学研究所、…

安防视频监控EasyCVR视频汇聚平台与萤石云平台的适配方案分析

随着科技的不断发展,互联网技术逐渐深入到我们生活的各个领域。其中,安防监控领域受益于互联网技术的发展,逐渐呈现出智能化、高清化、远程化的趋势。本文将介绍一种基于萤石云与EasyCVR平台的安防视频监控解决方案,以满足用户对安…

为什么估计的参数具有渐进高斯性?M-estimateor的渐进高斯性推导

M-estimators 在这里我们研究一种叫M-estimators的渐进高斯性。具体来说,如果参数估计可以用一个最小化或者最大化目标表示: θ o arg ⁡ min ⁡ θ ∈ Θ E [ q ( w , θ ) ] \theta _{o} \arg\min_{\theta \in \Theta }\mathbb{E}[ q(w,\theta )] θ…

HHDESK便捷功能介绍四

1 窗口切换 在文件管理界面,点击切换按钮,除了可以对左右两边窗口进行位置切换; 也可以直接打开该文件夹,并且进行图片浏览。 2 新建功能 同样是在文件管理中,点击新建,可在当前文件夹中创建各类文件&…

长连接与短连接的区别以及使用场景

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 短连接 1、连接->传输数据->关闭连接…

想做WMS仓库管理系统,找了好久才找到云表

公司内部仓库管理原方式均基于人工电子表格管理方式来实现收发存管理,没有流程化管理,无法保证数据的准确性和及时性,同时现场操作和数据核对会出现不同步的情况,无法提高仓库的运作效率,因此,我们基于云表…

区块链服务网络BSN季度版本迭代说明【2023年Q3】

根据区块链服务网络发展联盟计划安排,BSN将每周进行一个小的版本迭代,每季度进行一个大的版本迭代,目前区块链服务网络(BSN)已完成最新季度版本迭代。 我们将按照BSN官方专网(国内版和国际版)、…

网络工程师知识点5

71、什么是FTP? FTP是文件传输协议。 FTP传输数据时支持两种传输模式:ASCII模式和二进制模式。 需要TCP的21号端口来建立控制连接 需要TCP的20号端口来建立数据连接 72、什么是telnet? Telnet提供了一个交互式操作界面,允许终端远…

用Eclipse写java代码

1.新建项目 2.选择创建java项目 3.输入项目名称,选择specific JRE 可以选1.8版本的,finish 4.在src中新建包,包名为项目名.包名 5.在包中新建类 如何修改eclipse字体大小 看这里 6.写代码,写好之后运行 报错a jni error…

问:TCP/IP协议栈在内核态的好还是用户态的好

“TCP/IP协议栈到底是内核态的好还是用户态的好?” 问题的根源在于,干嘛非要这么刻意地去区分什么内核态和用户态。 引子 为了不让本文成为干巴巴的说教,在文章开头,我以一个实例分析开始。 最近一段时间,我几乎每…

ASEMI整流桥GBJ2510参数:拆析其关键性能特点

编辑-Z 在众多的电力电子元件中,GBJ2510整流桥以其高效能和可靠性赢得了工业领域的广泛认可。这款设备是在电力系统、直流电源等一系列设备中不可或缺的组件。本文将详细反析GBJ2510整流桥参数的关键性能特点,以帮助用户更加全面地理解和使用这种电子设…

微信小程序用 canvas 实现手写签名弹框(全网最最最详细!!)

文章目录 一、签字面板效果图二、WXML文件三、JS文件四、WXSS文件五、小Tips ~ 一、签字面板效果图 二、WXML文件 &#x1f338;点击弹出手写签名面板事件 <van-button type"default" bindtap"handWrittenSign">点击弹出手写签名弹框</van-butt…

通过电商API接口,代购系统可以获取到商品、订单、物流等多种信息

代购系统需要接入电商API接口&#xff0c;以便实现与电商平台的交互与数据共享。通过电商API接口&#xff0c;代购系统可以获取到商品、订单、物流等多种信息&#xff0c;同时也可以完成下单、支付、退货等多种操作。 对于用户来说&#xff0c;接入电商API接口可以提供以下好处…

Linux性能基础:CPU、内存、磁盘等概述

目录 1. CPU 1.1. CPU常见品牌 1.2. CPU性能概述 ① CPU主频 ② CPU位数 ③ CPU缓存指令集 ④ CPU核心数 ⑤ IPC 1.3. 上下文切换 1.4. 进程与线程 ① 进程 ② 线程 2. 内存 2.1. 内存主频 2.2. 内存带宽 2.3. 内存分类 2.4. 内存的分配 2.5. 内存的回收 2.6. 内存泄漏 3. 磁盘…

Mysql系列---【linux安装mysql8.1.0】

1.下载安装包 官网链接: https://dev.mysql.com/downloads/mysql/ 注意:linux查看glibc版本的命令: rpm -qa|grep glibc 2.把下载的包上传到/opt/app/middles目录下 注意: 速度可能有点慢。 3.解压压缩包 #xz解压 xz -d mysql-8.1.0-linux-glibc2.17-x86_64.tar.xz #tar解压 t…

c++仿写小波分解和去噪代码(只使用基础库)

小波分解C版本 C代码 参考了一些Github的代码 最终代码可从链接下载。 main函数如果打不开的话&#xff0c;使用 #include <iostream> #include <vector> #include <fstream> #include "wavelet.h"int main() {// 读取原始信号数据std::ifstrea…

用户生成内容vs专业生成内容:谁主海外社媒营销江山?

随着社交媒体和数字营销的崛起&#xff0c;海外社媒营销已经成为各大品牌推广产品和服务的一种主要方式。然而&#xff0c;在选择最佳策略时&#xff0c;品牌经常会面临一个关键的问题&#xff1a;是使用用户生成内容&#xff08;UGC&#xff09;还是专业生成内容&#xff08;P…

fix: prosemirror adds two extra spaces when paste

bug 项目使用 prosemirror&#xff0c;复制 NodeSelection 时&#xff0c;会在末尾多出两个空格。 NodeSelection prosemirror 的 Selection 是抽象类&#xff0c;它有三个子类 TextSelection 最常见的NodeSelection 指向单一节点的选区。设置了 selectable true 的节点&am…

C++项目实战——基于多设计模式下的同步异步日志系统-⑪-日志器管理类与全局建造者类设计(单例模式)

文章目录 专栏导读日志器建造者类完善单例日志器管理类设计思想单例日志器管理类设计全局建造者类设计日志器类、建造者类整理日志器管理类测试 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计…

达梦数据库适配ServiceStack框架

注&#xff1a;达梦的驱动版本请使用2023第四季度及以后版本驱动才可以 ServiceStack介绍 ServiceStack官网&#xff1a; https://github.com/ServiceStack/ServiceStack ServiceStack是一个开源的十分流行的WebService框架&#xff0c;引用其官网的介绍&#xff1a;“Servic…