Python实现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=96zoom_x = 1.33333333  # (1.33333333-->1056x816)   (2-->1584x1224)zoom_y = 1.33333333mat = 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转wordpdf2word(pdfPath)# 储存图片的目录imagePath = './images'# 2,pdf转图片pdf2image(pdfPath, imagePath)# 3,pdf转htmlpdf2html(pdfPath)

第三步,运行查看效果

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多模态大模型NextGPT整体结构图、模型示意图和使用模型时示意图

NextGPT模型整体结构 项目地址 论文地址 模型示意图 使用模型时示意图

企业如何凭借软文投放实现营销目标?

数字时代下,软文投放成为许多企业营销的主要方式,因为软文投放成本低且效果持续性强,最近也有不少企业来找媒介盒子进行软文投放,接下来媒介盒子就来给大家分享下,企业在软文投放中需要掌握哪些技巧,才能实…

批量修改视频尺寸:简单易用的视频剪辑软件教程

如果你需要批量修改视频尺寸,同时保持高质量的画质,那么“固乔剪辑助手”这款软件是你的不二之选。下面就是如何使用这款软件进行批量修改视频尺寸的详细步骤。 1. 首先,你需要在浏览器中进入“固乔科技”的官网,然后下载并安装“…

for循环遍历的`form表单组件`rules规则校验失效问题——下拉框选择之后还是报红---亲测有效

问题: 大概的效果就是这种, for循环选择之后还是还是报红 看文章之前 : 先检查 model rules pops 有没有判定好 解决: 参考了他的 for循环遍历的form表单组件rules规则校验失效问题——输入内容后依然提示必填,亲测有效——基础积累_a-form-model的validat…

NFTScan | 10.09~10.15 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2023.10.09~ 2023.10.15 NFT 热点资讯 01/ DeLabs:所有 DeGods 已重置回 Season1,用户可于本周将 y00ts 免费迁移至以太坊 10 月 9 日,DeGods & y…

前端小案例 | 一个带切换的登录注册界面(静态)

文章目录 &#x1f4da;HTML&#x1f4da;CSS&#x1f4da;JS &#x1f4da;HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sc…

HBase 表如何按照某表字段排序后顺序存储的方法?

首先需要明白HBase表的排序规则&#xff1a; &#xff08;1&#xff09;rowkey排序&#xff08;字典排序&#xff09;——升序 &#xff08;2&#xff09;Column排序&#xff08;字典排序&#xff09;——升序 &#xff08;3&#xff09;时间戳排序——降序 rowkey 字典序排序…

SpringMVC的拦截器(Interceptor)

拦截器简介 SpringMVC的拦截器Interceptor&#xff0c;主要是对Controller资源访问时进行拦截的基本操作的技术&#xff0c;当然拦截后可以进行权限控制&#xff0c;功能增强等都是可以的。拦截器类似于JavaWeb开发中的Filter&#xff0c;他们之间的区别如下图所示 Filter技术…

设计模式再探——适配器模式

目录 一、背景介绍二、思路&方案三、过程1.适配器模式简介2.适配器模式的类图3.适配器模式代码4.适配器模式&#xff0c;类适配器模式和对象的对比5.适配器模式终极奥秘 四、总结五、升华 一、背景介绍 最近公司在对业务模型做构建的时候&#xff0c;涉及到和三方系统的对…

学习嵌入式系统的推荐步骤:

学习嵌入式系统的推荐步骤&#xff1a; 00001. C语言&#xff1a;作为基础中的基础&#xff0c;选择一本常用的C语言教材&#xff0c;并注意通过实践编写习题、编译运行代码来加深理解。动手实践是非常重要的。 00002. 00003. 微机原理与接口技术&#xff1a;这本教材将…

Web攻防01-ASP应用相关漏洞-HTTP.SYSIIS短文件文件解析ACCESS注入

文章目录 ASP-默认安装-MDB数据库泄漏下载漏洞漏洞描述 ASP-中间件 HTTP.SYS&#xff08;CVE-2015-1635&#xff09;1、漏洞描述2、影响版本3、漏洞利用条件4、漏洞复现 ASP-中间件 IIS短文件漏洞1、漏洞描述2、漏洞成因:3、应用场景&#xff1a;4、利用工具&#xff1a;5、漏洞…

深入理解Scrapy

Scrapy是什么 An open source and collaborative framework for extracting the data you need from websites. In a fast, simple, yet extensible way. Scrapy是适用于Python的一个快速、简单、功能强大的web爬虫框架&#xff0c;通常用于抓取web站点并从页面中提取结构化的数…

嵌入式软硬分工与职业发展

嵌入式软硬分工与职业发展&#xff1a; 嵌入式系统分为软件和硬件两个方向。大公司通常明确员工从事嵌入式软件或硬件工作&#xff0c;分工合理利用经验解决问题。小公司可能综合工作&#xff0c;但长期不利深入学习和发展&#xff0c;对个人竞争力不利。嵌入式软件一般指底层…

Python学习基础笔记七十一——模块和库2

将模块放入包中 模块文件&#xff0c;功能分的比较清晰。文件与文件之间&#xff0c;是通过import这种调用关系。 当我们的项目模块文件特别多的时候&#xff0c;我们还需要将这些模块文件根据功能划分到不同的目录中。 这些放模块文件的目录&#xff0c;python把它们称之为p…

公司销售个人号如何管理?

微信管理系统可以帮助企业解决哪些问题呢&#xff1f; 一、解决聊天记录监管问题 1.聊天记录的保存&#xff0c;让公司的管理者可以随时查看公司任意销售与客户的聊天记录&#xff0c;不用一个一个员工逐一去看&#xff0c;方便管理&#xff1b; 2.敏感词监控&#xff0c;管理者…

git操作说明

SourceURL:file:///home/kingqi/桌面/git操作说明.doc 本地建立仓库 mkdir namebao cd namebao pwd git init 初始化 cd .git/ gedit config 本地存储 进入目录上传全部文件 git add . 提交 git commit -m “说明” 远程提交 复制gitee或者github仓库链接 可以直…

Eslint配置 Must use import to load ES Module(已解决)

最近在配置前端项目时&#xff0c;eslint经常会碰到各种报错&#xff08;灰常头疼~&#xff09; Syntax Error Error No ESLint configuration found.Syntax Error: Error: D:\dmq\dmq-ui.eslintrc.js: Environment key “es2021” is unknown at Array.forEach ()error in ./…

实验四:回溯算法的设计与分析

某不知名学校大二算法课实验报告 题目来自力扣 第一题&#xff1a;幂集 力扣题目链接&#xff1a;幂集 题目描述&#xff1a; 幂集。编写一种方法&#xff0c;返回某集合的所有子集。集合中不包含重复的元素。 说明&#xff1a;解集不能包含重复的子集。 示例: 输入&#xf…

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

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

【基础篇】七、Flink核心概念

文章目录 1、并行度2、并行度的设置3、算子链4、禁用算子链5、任务槽6、任务槽和并行度的关系 1、并行度 要处理的数据量很多时&#xff0c;可以把一个算子的操作&#xff08;比如前面demo里的flatMap、sum&#xff09;&#xff0c;"复制"多份到多个节点&#xff0c…