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

news2024/11/24 0:14:03
  • 解决问题

有时候将文档上传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 wx

class PDFExtractorApp(wx.App):
    def OnInit(self):
        self.frame = PDFExtractorFrame(None, title="PDF页面提取工具")
        self.SetTopWindow(self.frame)
        self.frame.Show()
        return True

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)

    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

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

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

相关文章

C#核心知识回顾——19.插入排序

1.插入排序的基本原理 871542639 两个区域 排序区 未排序区 用一个索引值做分水岭 未排序区元素 与排序区元素比较 插入到合适位置 直到未排序区清空 int[] arr { 8, 6, 7, 2, 9, 4 };//第一步//能取出未排序区…

防御第六次作业-文案

1.录制一个讲解密码学综合应用视频,参考讲义中的综合应用图 过程: 发送者为Alice 接受者为Bob 首先对原始信息进行hash运算得到信息摘要,然后使用私钥进行签名(签名的作用是验证该信息是Alice的),然后将…

设备类资产盘点报告系统怎么处理?

对于一个企业或者公司来说,掌握公司资产的实际情况是最基本的。要知道公司的资产,主要工作内容之一就是固定资产盘点。对于资产盘点,有一些应用。Excel人力资源方式,有的则采用固定资产管理系统。 RFID固定资产管理系统是指通过射…

Footprint Analytics 宣布 20+ 链 API 免费增速,助力熊市 buidler

7 月 31 日,web3 数据供应商 Footprint Analytics 宣布其 API 产品的重大更新。 此次升级不仅大幅提升了 API 产品调用速度限制,还开放了包括 Ethereum, BNB, Polygon, zkSync 等在内的 20 公链的免费数据调用。 此外,Footprint 还更新了新…

【网络】传输层

目录 一、端口号 1、端口号范围划分 2、知名端口号(Well-Know Port Number) 3、netstat 4、pidof 二、UDP协议 1、UDP协议段格式 2、UDP的特点 3、面向数据报 4、UDP的缓冲区 5、UDP使用注意事项 6、基于UDP的应用层协议 三、TCP协议 1、TCP协议段格式 2、确认应…

vim、awk、tail、grep的使用

vim命令 $定位到光标所在行的行末^定位到光标所在行的行首gg定位到文件的首行G定位到文件的末行dd删除光标所在行ndd删除n行(从光标所在行开始)D删除光标所在行,使之变为空白行x删除光标所在位置字符nx删除n个字符,从光标开始向后…

mac屏幕提词器Presentation Prompter for mac

Presentation Prompter是一款专业的电脑提词器软件,主要用于辅助演讲者、主持人等在演讲或演示过程中更加流畅地展示内容。它可以将文字以滚动或分页的形式显示在屏幕上,帮助演讲者在不中断演讲的情况下更好地掌控演讲进度。 以下是Presentation Prompt…

城市内涝积水监测预警系统的重要性

一、系统概述 随着我国城镇化快速发展,城市建设产生的大量地面硬底化,大部分的降雨将形成地表径流,仅有少量雨水渗入地下,导致城市内涝等一系列问题。当前,全国多地发生洪涝,我国南北方全面进入主汛期。需要…

【数据库】mysql调用过程函数生成日期维表

写在前面的话 第一次使用sql中的函数部分,本文会记录sql函数的一些基础语法,如果你已经很熟练,请忽视掉 创建日期维表 使用环境 Navicat 12 创建存储日期的表(日期,日期的不同的表达形式,这一年的第几周&…

瑞芯微原厂源码目录介绍2-RK3568

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言顶层目录分析out 目录system 目录frameworks 目录了解目录有什么意义 前言 在上一个小节中,下载并解压了瑞芯微提供的 Android 源码,解…

51单片机学习--LED点阵屏显示图形动画

为了通用性考虑,需要把用到的几个口用特殊位声明来重新命名,由于RCLK在头文件中已有定义,所以这里把P3^5声明成RCK吧。。这样的做法可以提高可读性 sbit RCK P3^5; //RCLK sbit SCK P3^6; //SRCLK sbit SER P3^4;接下来编写74HC595的输…

开源软件包存储库存在1200+恶意包,供应链安全何去何从

一、前言 2020年12月13日,网络安全公司FireEye发布分析报告,称全球最著名的网络安全软件供应商SolarWinds遭受供应链攻击并被植入木马后门,影响版本为2019.4 HF 5 - 2020.2.1:使用该产品的机器可被攻击者完全操控。根据SolarWind…

前端学习——Vue (Day9)

Pinia 快速入门 https://pinia.vuejs.org/zh/getting-started.html npm install pinia import { createApp } from vue import { createPinia } from pinia import App from ./App.vueconst pinia createPinia() const app createApp(App)app.use(pinia) app.mount(#app)&l…

2分钟大白话:什么是大数据架构。人人好懂

问题背景 在40岁老架构师 尼恩的读者社区(50)中,尼恩一直指导大家写简历,做面试,最高的拿到年薪近100W。 昨天指导 一个 阿里 p6 小伙写简历,做面试。在帮他 挖掘简历亮点时,发现他项目在Java上没有什么技术亮点&…

Vcenter 创建 虚拟机配置 Thin Provision 模式 disk

介绍 在vCenter中选择虚拟磁盘格式通常也取决于您的需求和使用情况。 vSphere支持多种虚拟磁盘格式,以下是一些常见的格式: Thick Provision Lazy Zeroed:这是vSphere中的默认格式。它会预分配虚拟磁盘所需的存储空间,但只有在虚…

pdf大小如何压缩?三个压缩技巧快学来

在日常生活中,我们经常会遇到PDF文件过大,导致无法传输或存储的问题。那么,如何解决这个问题呢?其实,有很多软件可以帮助我们解决这个需求,下面就给大家汇总几个简单实用的PDF压缩工具,一起来看…

Python爬虫时遇到连接超时解决方案

在进行Python爬虫任务时,经常会遇到连接超时(TimeoutError)错误。连接超时意味着爬虫无法在规定的时间内建立与目标服务器的连接,导致请求失败。为了帮助您解决这个常见的问题,本文将提供一些解决办法,并提…

C# Blazor 学习笔记(3):路由管理

文章目录 前言路由管理App.razor设置登录页面设置空布局 前言 我们知道使用Blazor的官方模板,我们会自动得到一个拥有侧边栏的布局页面。但是我们发现我们所有新建的页面都有侧边栏。有时候我们需要跳出这个布局,比如我要做登录页面的时候,我…

Stata的--随机效应模型处理,以及介绍

今天分享随机效应模型 主要包含以下两个部分 第一个部分是随机效应模型的介绍 第二个部分是随机效应模型的Stata命令 首先我们来看下第一个部分随机效应模型 首先我们先回顾一下我们上文讲的混合OLS模型 当我们的面板数据在个体效应检验结果不显著的时候 既不存在个体效应…

Android U MO Call流程时序图

流程时序如下 Android U MO Call流程时序图 转载请注明出处。