首页 > 编程语言 >Python实现PDF转换文件格式

Python实现PDF转换文件格式

时间:2023-10-16 16:34:32浏览次数:37  
标签:return str Python 文件格式 file path print PDF pdf

最近工作中经常遇到收到其他人提供的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)

 

第三步,运行查看效果

 

标签:return,str,Python,文件格式,file,path,print,PDF,pdf
From: https://www.cnblogs.com/xh2023/p/17767682.html

相关文章

  • 小程序分享pdf文件(uniapp)
    share(){wx.downloadFile({url:'',//下载urlsuccess(res){//下载完成后转发wx.shareFileMessage({filePath:res.tempFilePath,suc......
  • python - bleak的低功耗蓝牙设备连接
    1.接收蓝牙日志可以用手机拨号##5959##打开蓝牙调试然后使用对应的手机app先使用对应的蓝牙产品2.蓝牙日志分析将手机上的蓝牙日志文件(btsnoop_hci.log)拷贝到电脑上使用wireshark打开,主要是看发送和接收的数据,以下是某体重秤3.寻找设备importasynciofrombleakimp......
  • python create_future
      importasyncioasyncdefmain():loop=asyncio.get_running_loop()future=loop.create_future()print("Futurecreated:",future)awaitasyncio.sleep(1)future.set_result("Hello,World!")print("Resul......
  • Python爬虫:抖音 JS XB逆向解析
    哈喽兄弟们,抖音现在有JS加密,以前的方法爬不了饿了,今天来实现一下某音短视频的JS逆向解析。知识点动态数据抓包`在这里插入代码片`requests发送请求X-Bogus 参数逆向环境模块python 3.8               运行代码pycharm 2022.3           辅......
  • PDF多份文档合并为一份
    REPORTZ_PDF_MODULE.TYPES:BEGINOFgty_result,contentTYPEfpcontent,ENDOFgty_result,gty_result_tabTYPESTANDARDTABLEOFgty_result.DATA:ls_resultTYPEgty_result,gt_resultTYPEgty_result_tab.START-O......
  • Python处理Request请求
    一、HTTP知识:request请求方式有GET/POST/PUT/PATCH/DELETE/COPY/HEAD/OPTIONS/LINK/VIEW等常用的request请求有:get和post两种形式。1.GET用于获取资源,当采用GET方式请求指定资源时,被访问的资源经服务器解析后立即返回响应内容。通常以GET方式请求特定资源时,请求中不应该......
  • python封装https请求
    importhttp.clientimportjsonclassHTTPS_Connection:def__init__(self,res_type,body,url,api_path,headers):self.res_type=res_type#接口请求类型self.body=body#请求参数self.url=url#请求服务地址......
  • 在vscode中将markdown文件导出为pdf
    首先安装插件:然后在md文件中右键,选择如图所示选项跳转到预览界面之后,右键依次选择如图所示选项导出完成,pdf文件与md文件在同一文件目录下。......
  • python准备工作
    准备工作导学:为什么学python?python1.简洁高效2.应用场景丰富 人生苦短,我用python Python语言基础入门什么是编程语言?用于与人类和计算机进行交流的一种语言,通过编写编程语言的代码,去指挥计算机工作。python的安装安装完验证: 我的第一个程序  Pythoncharm......
  • 树叶识别系统python+Django网页界面+TensorFlow+算法模型+数据集+图像识别分类
    一、介绍树叶识别系统。使用Python作为主要编程语言开发,通过收集常见的6中树叶('广玉兰','杜鹃','梧桐','樟叶','芭蕉','银杏')图片作为数据集,然后使用TensorFlow搭建ResNet50算法网络模型,通过对数据集进行处理后进行模型迭代训练,得到一个识别精度较高的H5模型文件。并基于Dja......