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

快速转换PDF文件: Python和PyMuPDF教程

  • 解决问题

有时候将文档上传Claude2做分析,有大小限制,所以需要切割pdf文档为几个小点的文档,故才有了本文章。

如何用Python和PyMuPDF制作你想要大小的PDF?

PDF是一种广泛使用的文件格式,可以在任何设备上查看和打印。但是,有时您可能只需要查看PDF文件中的前几页,而不是整个文件。在这种情况下,将PDF文件转换为只包含指定页数的新文件可能是有用的。本文将介绍如何使用Python和PyMuPDF模块来实现此任务。

  • 安装PyMuPDF模块

在使用PyMuPDF之前,我们需要先安装它。可以使用以下命令来安装PyMuPDF:

pip install PyMuPDF
  •  导入PyMuPDF和wxPython模块

接下来,我们需要导入PyMuPDF和wxPython模块:

import fitz
import wx
  • 创建GUI界面

为了方便用户输入PDF文件和页码数量,我们将创建一个简单的GUI界面。我们将使用wxPython模块来创建GUI界面。以下是代码示例:

class PDFExtractorFrame(wx.Frame):def __init__(self, *args, **kw):super(PDFExtractorFrame, self).__init__(*args, **kw)panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)self.file_picker = wx.FilePickerCtrl(panel, message="选择PDF文件", wildcard="PDF Files (*.pdf)|*.pdf",style=wx.FLP_DEFAULT_STYLE | wx.FLP_USE_TEXTCTRL)vbox.Add(self.file_picker, 0, wx.EXPAND | wx.ALL, 10)self.page_input = wx.TextCtrl(panel, value="1", style=wx.TE_PROCESS_ENTER)vbox.Add(self.page_input, 0, wx.EXPAND | wx.ALL, 10)extract_button = wx.Button(panel, label="提取", size=(70, 30))extract_button.Bind(wx.EVT_BUTTON, self.on_extract)vbox.Add(extract_button, 0, wx.ALIGN_CENTER | wx.ALL, 10)panel.SetSizer(vbox)self.Bind(wx.EVT_TEXT_ENTER, self.on_extract, self.page_input)

 此代码创建一个名为PDFExtractorFrame的wx.Frame类,并在其构造函数中创建GUI界面元素。它创建了一个wx.Panel对象和两个wx.BoxSizer对象来放置GUI元素。在此GUI界面中,用户可以选择PDF文件和输入要保留的页码数量。

  • 实现转换功能

接下来,我们需要实现转换功能。我们将使用PyMuPDF模块来打开PDF文件,并使用它来复制指定数量的页面。以下是代码示例:

def extract_pages(self, input_pdf, page_number, output_pdf):# 打开PDF文档pdf_document = fitz.open(input_pdf)total_pages = pdf_document.page_count# 确保页码不超过文档的总页数page_number = min(page_number, total_pages)# 创建新的PDF文档,只包含指定页码之前的内容pdf_writer = fitz.open()for page in range(page_number):pdf_writer.insert_pdf(pdf_document, from_page=page, to_page=page)# 保存新的PDF文档到指定路径pdf_writer.save(output_pdf)pdf_writer.close()pdf_document.close()

此代码使用PyMuPDF模块将PDF文件转换为只包含前N页的新PDF文件的函数。该函数将源PDF文件路径,要提取的页数和新PDF文件的输出路径作为参数,并返回无返回值。以下是该函数的详细说明:

  • input_pdf: 源PDF文件的路径。
  • page_number: 要提取的页数。
  • output_pdf: 新PDF文件的输出路径。

该函数使用fitz.open()函数打开输入PDF文件并获取其总页数。如果指定的页码数量超过文档的总页数,则将其设置为文档的总页数。

在创建新的PDF文档之前,该函数创建一个空的PDF文档对象。然后,它使用insert_pdf()函数从源PDF文件中复制每个页面,并将其插入到新的PDF文档对象中。该函数只复制指定数量的页面。

最后,该函数使用save()函数将新PDF文档保存到指定的输出路径,并使用close()函数关闭所有打开的PDF文档对象以释放资源。

  • 运行应用程序

  • 完整代码

import fitz  # PyMuPDF
import wxclass PDFExtractorApp(wx.App):def OnInit(self):self.frame = PDFExtractorFrame(None, title="PDF页面提取工具")self.SetTopWindow(self.frame)self.frame.Show()return Trueclass PDFExtractorFrame(wx.Frame):def __init__(self, *args, **kw):super(PDFExtractorFrame, self).__init__(*args, **kw)panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)self.file_picker = wx.FilePickerCtrl(panel, message="选择PDF文件", wildcard="PDF Files (*.pdf)|*.pdf",style=wx.FLP_DEFAULT_STYLE | wx.FLP_USE_TEXTCTRL)vbox.Add(self.file_picker, 0, wx.EXPAND | wx.ALL, 10)self.page_input = wx.TextCtrl(panel, value="1", style=wx.TE_PROCESS_ENTER)vbox.Add(self.page_input, 0, wx.EXPAND | wx.ALL, 10)extract_button = wx.Button(panel, label="提取", size=(70, 30))extract_button.Bind(wx.EVT_BUTTON, self.on_extract)vbox.Add(extract_button, 0, wx.ALIGN_CENTER | wx.ALL, 10)panel.SetSizer(vbox)self.Bind(wx.EVT_TEXT_ENTER, self.on_extract, self.page_input)def on_extract(self, event):input_pdf = self.file_picker.GetPath()output_pdf = "output.pdf"try:page_number = int(self.page_input.GetValue())self.extract_pages(input_pdf, page_number, output_pdf)wx.MessageBox("PDF页面提取完成!", "成功", wx.OK | wx.ICON_INFORMATION)except ValueError:wx.MessageBox("无效的页码输入!", "错误", wx.OK | wx.ICON_ERROR)def extract_pages(self, input_pdf, page_number, output_pdf):# 打开PDF文档pdf_document = fitz.open(input_pdf)total_pages = pdf_document.page_count# 确保页码不超过文档的总页数page_number = min(page_number, total_pages)# 创建新的PDF文档,只包含指定页码之前的内容pdf_writer = fitz.open()for page in range(page_number):pdf_writer.insert_pdf(pdf_document, from_page=page, to_page=page)# 保存新的PDF文档到指定路径pdf_writer.save(output_pdf)pdf_writer.close()pdf_document.close()if __name__ == '__main__':app = PDFExtractorApp()app.MainLoop()

C:\pythoncode\new\copypdfsaveas.py

相关文章:

快速转换PDF文件: Python和PyMuPDF教程

解决问题 有时候将文档上传Claude2做分析,有大小限制,所以需要切割pdf文档为几个小点的文档,故才有了本文章。 如何用Python和PyMuPDF制作你想要大小的PDF? PDF是一种广泛使用的文件格式,可以在任何设备上查看和打印…...

规划模型Matlab代码

文章目录 数学规划定义一般形式分类 1.线性规划(linear programming)2.非线性规划(nonlinear programming)3. 整数规划(integer programming)4. 0-1规划(0-1 programming)5. 最大最小化模型6. 多目标规划模型7.敏感性分析(对权重)[例题] 数学规划定义 数…...

用html+javascript打造公文一键排版系统11:改进单一附件说明排版

一、用htmljavascript打造公文一键排版系统10中的一个bug 在 用htmljavascript打造公文一键排版系统10:单一附件说明排版 中,我们对附件说明的排版函数是: function setAtttDescFmt(p) {var t p;var a ;if (-1 ! t.indexOf(:))//是半角冒…...

snap xxx has “install-snap“ change in progress

error description * 系重复安装,进程冲突 solution 展示snap的改变 然后sudo snap abort 22即可终止该进程 之后重新运行install command~~ PS: ubuntu有时候加载不出来,执行resolvectl flush-caches,清除dns缓存…...

Elasticsearch 性能调优指南

目录 1、通用优化策略 1.1 通用最小化法则 1.2 职责单一原则 1.3 其他 2、写性能调优 2.1 基本原则 2.2 优化手段 2.2.1 增加 flush 时间间隔, 2.2.2 增加refresh_interval的参数值 2.2.3 增加Buffer大小, 2.2.4 关闭副本 2.2.5 禁用swap 2…...

学习Boost一:学习方法和学习目的

学习目的 Boost 的学习目的: 因为从知乎和CSND上根据了解内容来看,Boost作为一个历史悠久的开源库,已经脱离了一个单纯的库的概念了,他因庞大的涉及面应当被称之为库集。 并且,因为boost库优秀的试用反馈和开发人员的…...

c语言每日一练(1)

前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情…...

iOS开发-CocoaLumberjack日志库实现Logger日志功能

iOS开发-Logger日志功能实现 在iOS开发中,常用CocoaLumberjack来作为日志功能实现的日志框架 一、CocoaLumberjack是什么? CocoaLumberjack 是 支持 iOS 和 Mac 平台的日志框架,使用简单,功能强大且不失灵活,它的主…...

深度学习(34)—— StarGAN(2)

深度学习(34)—— StarGAN(2) 完整项目在这里:欢迎造访 文章目录 深度学习(34)—— StarGAN(2)1. build model(1)generator(2&#…...

use lua

-- basic.lua print("hello ".."world") local a 1 --only this file can see b 2 -- global see -- not declare vaiable all asign to nil print(fuck) -- 字符串可以"" , ,[[]] -- 一些数值运算支持,进制数,科学数&a…...

网络——初识网络

网络基础 文章目录 网络基础计算机网络产生的背景认识网络协议网络协议初识协议分层OSI七层模型TCP/IP四层模型网络传输基本流程协议报头 认识IP地址认识MAC地址ifconfig查看主机地址ifconfig查看主机地址 计算机网络产生的背景 独立模式:计算机之间相互独立 早期的…...

调试技巧(2)

6. 如何写出好(易于调试)的代码 6.1 优秀的代码: 代码运行正常bug很少效率高可读性高可维护性高注释清晰文档齐全 常见的coding技巧: 使用assert尽量使用const养成良好的编码风格添加必要的注释避免编码的陷阱。 这里讲一下assert…...

骨传导耳机真不伤耳吗?骨传导耳机有什么好处?

骨传导耳机真不伤耳吗?骨传导耳机有什么好处? 我先来说说骨传导耳机的工作原理吧,骨传导是一种传声方式,声波通过颅骨、颌骨等头部骨头的振动,将声音传到内耳。其实骨传导的现象我们很常见,就像我们平时嗑瓜…...

mac切换jdk版本

查询mac已有版本 1、打开终端,输入: /usr/libexec/java_home -V注意:输入命令参数区分大小写(必须是-V) 2.目前本地装有两个版本的jdk xxxxedydeMacBook-Pro-9 ~ % /usr/libexec/java_home -V Matching Java Virtual Machines (2):20.0.1 (…...

go 基本语法(简单案例)

!注: go中 对变量申明很是严格,申明了,在没有使用的情况下,也会产生编译错误 1.行分隔符 一行就是代码,无;分割,如果需要在一行展示,需要以;分割,…...

Permute 3 for mac音视频格式转换

Permute是一款Mac平台上的媒体格式转换软件,由Chaotic Software开发。它可以帮助用户快速地将各种音频、视频和图像文件转换成所需格式,并提供了一些常用工具以便于用户进行编辑和处理。 Permute的主要特点包括: - 支持大量格式:支…...

线程概念linux

何为线程: 线程是程序中负责执行的单位,它可以被看作是进程的一部分,是进程的子任务。线程与进程的区别在于,进程是一个资源单位,而线程是进程的一部分,它只有栈这个独立的资源,其他资源如代码…...

【Yolov5+Deepsort】训练自己的数据集(1)| 目标检测追踪 | 轨迹绘制

📢前言:本篇是关于如何使用YoloV5Deepsort训练自己的数据集,从而实现目标检测与目标追踪,并绘制出物体的运动轨迹。本章讲解的为第一个内容:简单介绍YoloV5Deepsort中所用到的目标检测,追踪及sort&Depp…...

express学习笔记4 - 热更新以及express-boom

我们每次改动代码的时候都要重启项目,现在我们给项目添加一个热更新 npm install --save-dev nodemon # or using yarn: yarn add nodemon -D 在package.json添加一行代码 "dev": "nodemon ./bin/www" 重启项目 然后随便做改动&#xff…...

Ajax_02学习笔记(源码 + 图书管理业务 + 以及 个人信息修改功能)

Ajax_02 01_Bootstrap框架-控制弹框的使用 代码 <!-- 引入bootstrap.css --> <link href"https://cdn.jsdelivr.net/npm/bootstrap5.2.2/dist/css/bootstrap.min.css" rel"stylesheet"><button type"button" class"btn btn…...

OpenClaw Windows一键部署包简体中文版下载

OpenClaw&#xff08;小龙虾&#xff09;Windows 一键部署保姆级教程 | 10分钟养出你的数字员工&#xff08;2026最新版&#xff09; 前言&#xff1a;2026年爆火的开源AI智能体OpenClaw&#xff08;昵称小龙虾&#xff09;&#xff0c;GitHub星标超28万&#xff0c;凭“本地运…...

终极macOS Windows启动盘制作工具:WinDiskWriter完整指南

终极macOS Windows启动盘制作工具&#xff1a;WinDiskWriter完整指南 【免费下载链接】windiskwriter &#x1f5a5; Windows Bootable USB creator for macOS. &#x1f6e0; Patches Windows 11 to bypass TPM and Secure Boot requirements. &#x1f47e; UEFI & Legac…...

深度解析EdiZon:Switch游戏存档管理与内存编辑的进阶实战指南

深度解析EdiZon&#xff1a;Switch游戏存档管理与内存编辑的进阶实战指南 【免费下载链接】EdiZon &#x1f4a1; A homebrew save management, editing tool and memory trainer for Horizon (Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/ed/EdiZon 在…...

智能设计时代的企业VI物料采购:小批量定制降本增效实践

核心摘要 在智能设计与柔性供应链深度融合的背景下&#xff0c;企业可通过一体化在线平台实现“品牌周边”小批量定制&#xff0c;将传统跨环节采购转为单线闭环&#xff0c;显著降低沟通与试错成本。小批量定制的核心价值&#xff1a;打破传统印厂起订量限制&#xff0c;按需…...

无人机带多传感器就死机、数据不同步?做了 17 年工业主机研发,教你解决多设备协同的核心痛点

做了 17 年工业主机研发&#xff0c;我发现一个特别有意思的现象&#xff1a;很多客户的无人机&#xff0c;只带一个普通摄像头的时候&#xff0c;飞得稳稳当当&#xff0c;什么毛病都没有。但一旦加上激光雷达、毫米波雷达、热成像相机、多光谱相机这些传感器&#xff0c;就开…...

提升3倍效率的Windows桌面端酷安社区解决方案:基于UWP平台的高性能第三方客户端

提升3倍效率的Windows桌面端酷安社区解决方案&#xff1a;基于UWP平台的高性能第三方客户端 【免费下载链接】Coolapk-UWP 一个基于 UWP 平台的第三方酷安客户端 项目地址: https://gitcode.com/gh_mirrors/co/Coolapk-UWP Coolapk-UWP是一款基于UWP平台的第三方酷安客户…...

2026 毕业季 AI 论文工具硬核横评:从初稿到定稿,9 款神器帮你告别熬夜焦虑

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertation 引言&#xff1a;毕业季论文困局&#xff0c;AI 工具成破局关键 又到一年毕业季&#xff0c;本科毕业论文成为无…...

避坑指南:合宙ESP32-C3连接MPU6050时常见的I2C通信失败与数据跳变问题

ESP32-C3与MPU6050实战避坑手册&#xff1a;从I2C通信失败到数据稳定的全链路解决方案 当你在深夜调试ESP32-C3与MPU6050的组合时&#xff0c;突然发现串口监视器不断弹出"not find MPU6050"的红色警告&#xff0c;或者读取到的加速度数据像过山车一样疯狂跳动——这…...

跨境电商作图不纠结!风格全覆盖, AI 工具帮你省超多心

做跨境电商这么多年&#xff0c;最头疼的从来不是选品和运营&#xff0c;而是作图&#xff01;不同平台风格要求不一样、不同国家审美差异大、小白没设计基础、外包贵还改到崩溃… 相信不少跨境卖家都跟我一样&#xff0c;在作图这件事上踩过无数坑。今天就以老卖家的身份&…...

从0到1:企业级AI项目迭代日记 Vol.29|自然语言变工作流:Agent 自动拼装子图的实现路径

把一件复杂的事做简单&#xff0c;有两种方式&#xff1a;降低门槛&#xff0c;或者让别人替你做。团队选择了后者。那个“别人”&#xff0c;是我们自己的 AI。一、工作流太难配&#xff0c;所以让 Agent 来配昨天上线了工作流初版&#xff0c;可视化节点编排&#xff0c;支持…...