当前位置: 首页 > news >正文

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)

第三步,运行查看效果

相关文章:

Python实现PDF转换文件格式

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

【Ceph Cluster】完全删除Ceph集群

注意:在执行这些步骤之前,请确保你已经备份了所有重要的数据,并且你明白这些步骤将永久删除 Ceph 集群。 停止 Ceph 服务: systemctl stop ceph.target卸载 Ceph 包:卸载 Ceph 相关的软件包,使用你的 Linux…...

4.Vue-Vue调用第三方接口

题记 用vue调用第三方接口,以下是全部代码和操作流程。 寻找第三方接口网站 推荐:免费API - 提供免费接口调用平台 (aa1.cn) 下面的代码以下图中的接口为例 安装axios模块 在终端输入以下命令: npm install axios 调用第三方接口代码 调…...

大语言模型在推荐系统的实践应用

本文从应用视角出发,尝试把大语言模型中的一些长处放在推荐系统中。 01 背景和问题 传统的推荐模型网络参数效果较小(不包括embedding参数),训练和推理的时间、空间开销较小,也能充分利用用户-物品的协同信号。但是它的缺陷是只能利用数据…...

第三章 交换技术及应用

目录 3.1 port-vlan技术 3.1.1 VLAN概述 3.1.2 VLAN划分方法——Port-VLAN 3.1.3 Port-VLAN工作原理 3.1.3 Port-VLAN配置 3.2 port-vlan仿真演示 3.2.1 实验背景 3.2.2 实验目的 3.2.3 实验设备 3.2.4 实验步骤思维导图 3.3 tag-vlan技术 3.3.1 问题分析 3.3.2 T…...

地震勘探原理部分问题解答

1、二维/三维(陆地/海洋)地震勘探,炮点(激发点)和检波点(接收点)的排布位置如何?画图作答? (1)陆地地震勘探 二维陆地地震野外采集:震…...

两个步骤轻松搞定批量合并视频

你是否曾经有过批量合并视频的需求,但是却苦于不知道如何下手?今天,我将为你介绍一个简单易行的方法,只需两个步骤,让你轻松实现批量合并视频。 第一步:下载并打开固乔智剪软件 首先,你需要下载…...

VR虚拟现实在室内设计仿真教学中的应用演示

1. 虚拟实景漫游:利用VR技术,学生可以通过戴上VR头盔来进入一个虚拟的室内环境中,感受真实的空间氛围。他们可以自由移动和观察,感受室内设计的效果。这样的体验可以增强学生的想象力和空间感知能力,提高他们的设计水平…...

Python操作串口通信

Python操作串口通信 注意Linux下先要修改串口的权限: sudo chmod 777 /dev/ttyUSB0 以下是python代码: # codingutf-8 # 包:pyserial,pymysql # 权限:sudo chmod 777 /dev/ttyUSB0 import serial # import pymysql …...

图详解第四篇:单源最短路径--Dijkstra算法

文章目录 1. 最短路径问题2. 单源最短路径--Dijkstra算法算法思想图解如何存储路径及其权值代码实现调式观察打印最短路径Dijkstra算法的缺陷 3. 源码 1. 最短路径问题 最短路径问题: 从带权有向图(求最短路径通常是有向图)G中的某一顶点出发…...

CRMEB多商户商城系统阿里云集群部署教程

注意: 1.所有服务创建时地域一定要选择一致,这里我用的是杭州K区 2.文件/图片上传一定要用类似oss的云文件服务, 本文不做演示 一、 创建容器镜像服务,容器镜像服务(aliyun.com) ,个人版本就可以 先创建一个命名空间 然后创建一个镜像仓库 查看并记录镜像公网地址…...

Java第三方登录封装工具类

Java中可以使用第三方登录来简化用户登录流程,常见的第三方登录如QQ、微信、微博等。下面是一个Java封装第三方登录的工具类: import java.io.IOException; import java.util.HashMap; import java.util.Map;import org.apache.http.client.ClientProto…...

BUUCTF学习(四): 文件包含tips

1、介绍 2、hackBar插件安装 教程: Hackbar插件安装-CSDN博客 3、解题 php://filter/readconvert.base64-encode/resource要读取的文件 ?filephp://filter/readconvert.base64-encode/resourceflag.php Base64 在线编码解码 | Base64 加密解密 - Base64.us 结束...

德国人工智能公司【Kodex AI】完成160万欧元融资

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,总部位于德国柏林的人工智能公司【Kodex AI】今日宣布已完成160万欧元融资。 本轮融资由Signals VC领投,Techstars、德意志银行等天使投资者参与,其中包括:most AI首席执行官…...

LeetCode 2 两数相加

题目描述 链接:https://leetcode.cn/problems/add-two-numbers/?envTypefeatured-list&envId2ckc81c?envTypefeatured-list&envId2ckc81c 难度:中等 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式…...

springboot项目启动失败,不打印报错详细信息(启动打印日记问题)

1&#xff1a;出现这种我问题一般都是日记的问题&#xff0c;查看控制台启动打印的第一句&#xff0c;为什么启动失败&#xff0c;需要用那个日记 2&#xff1a;如果使用的是log4j或者logback与slf4j都是默认在依赖web自带的如下 <dependency><groupId>org.springf…...

MyBatis (where、set、foreach)标签

where标签 在上一节SQL 语句中加入了一个条件“11”&#xff0c;如果没有加入这个条件&#xff0c;那么可能就会变成下面这样一条错误的语句。 SELECT id,name,url,age,country FROM website AND name LIKE CONCAT(%,#{name},%)显然以上语句会出现 SQL 语法异常&#xff0c;但…...

flutter开发之安装dart

1、在MacOS系统中打开终端&#xff0c;进入到官网Get the Dart SDK | Dart brew tap dart-lang/dartbrew install dart 注意&#xff1a;若显示没有brew&#xff0c;请先执行第二步骤&#xff0c;如下&#xff1a; 2、打开homebrew的官网Homebrew — The Missing Package Man…...

向量召回:深入评估离线体系,探索优质召回方法

向量召回:深入评估离线体系,探索优质召回方法 1.简介 近年来,基于向量进行召回的做法在搜索和推荐领域都得到了比较广泛的应用,并且在学术界发表的论文中,基于向量的 dense retrieve 的方法也在不少数据集上都战胜了 sparse retrieve,吸引了越来越多的关注。在内网的不…...

播放器缓存队列bug解决方案

背景 我在开发一个播放器的缓存队列时&#xff0c;遇到一个bug,导致包和帧无法被下一个模块读取 找了半天&#xff0c;原来是队列中的包和帧数据要进行内容的刷新暂存 包数据和帧数据不能直接放入队列 //入队&#xff0c;包进队列 int AVPacketQueue::Push(AVPacket *val,i…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...