Python PDF文件拆分-详解

目录

使用工具

将PDF按页数拆分

将PDF的每一页拆分为单独的文件

将PDF按指定页数拆分

根据页码范围拆分PDF

根据指定内容拆分PDF

将PDF的一页拆分为多页


在日常生活中,我们常常会遇到大型的PDF文件,这些文件可能难以发送、管理和查阅。将PDF拆分成多个小文件是一个实用的解决方案,可以为我们带来多重好处。首先,拆分PDF可以提高文件的可读性,使用户更容易找到所需信息。此外,拆分后的文件更便于分享和协作,特别适用于团队项目,让不同成员能够同时处理各自负责的部分。同时,这种方法还能有效保护隐私,允许将敏感信息单独处理,从而降低数据泄露的风险。

这篇博客将探讨如何使用Python实现PDF文件拆分,主要涵盖以下几个方面的内容:

  • 将PDF按页数拆分
    • 将PDF的每一页拆分为单独的文件
    • 将PDF按指定页数拆分
  • 将PDF按页码范围拆分
  • 将PDF按指定内容拆分
  • 将PDF的一页拆分为多页

使用工具

要在Python中实现拆分PDF文件,可以使用Spire.PDF for Python库。该库主要用于在Python应用程序中生成和处理PDF文档,也支持将PDF转换为其他格式,例如图片,Word和Excel等。

安装 Spire.PDF

在开始之前,需要先安装 Spire.PDF 库。你可以在终端中运行以下命令进行安装:

pip install spire.pdf

将PDF按页数拆分

在按页数拆分PDF文件时,你可以将PDF文档的每一页拆分为一个单独的文件,也可以将PDF文档按指定页数拆分。下面将对这两种方式逐一进行介绍。

将PDF的每一页拆分为单独的文件

Spire.PDF for Python提供了PdfDocument.Split()方法,支持将PDF文档按页拆分,生成的每个文件仅包含原始文档中的一页。具体实现步骤如下:

  • 创建PdfDocument对象。
  • 使用PdfDocument.LoadFromFile()方法打开PDF文档。
  • 使用PdfDocument.Split()方法将PDF文档的每一页拆分为单独的PDF文档。

实现代码:

from spire.pdf.common import *
from spire.pdf import *

# 创建PdfDocument对象
pdf = PdfDocument()
# 加载PDF文件
pdf.LoadFromFile("心理健康.pdf")

# 将PDF文件拆分为多个PDF文件,每个文件仅包含原始PDF中的一页
pdf.Split("拆分PDF/第{0}页.pdf", 1)

# 关闭PdfDocument对象
pdf.Close()

Python 将PDF的每一页拆分为单独的文件

将PDF按指定页数拆分

将 PDF 文件按指定页数拆分的方法是通过创建新的 PDF 文档并将指定数量的页面插入其中来实现。具体实现步骤如下:

  • 创建PdfDocument对象。
  • 使用PdfDocument.LoadFromFile()方法打开PDF文档。
  • 获取PDF文档的总页数。
  • 使用循环按指定页数拆分PDF:
    • 设置起始页和结束页。
    • 创建新的PdfDocument对象。
    • 使用PdfDocument.InsertPageRange()方法将当前页码范围内的页面插入到新PDF文档中。
    • 使用PdfDocument.SaveToFile()方法保存生成的PDF文档。

实现代码:

from spire.pdf.common import *
from spire.pdf import *

# 将PDF按指定页数拆分的方法
def split_pdf_by_page_count(input_file, page_count):
    # 创建PdfDocument对象
    pdf = PdfDocument()
    # 加载PDF文件
    pdf.LoadFromFile(input_file)

    # 计算总页数
    total_pages = pdf.Pages.Count

    # 按指定页数拆分PDF
    for i in range(0, total_pages, page_count):
        # 创建新的PdfDocument对象
        new_pdf = PdfDocument()
        
        # 计算当前要插入的页码范围
        start_page = i
        end_page = min(i + page_count - 1, total_pages - 1)  # 确保不超过总页数
        
        # 将当前页码范围的页面插入到新PDF中
        new_pdf.InsertPageRange(pdf, start_page, end_page)

        # 保存生成的文件
        new_pdf.SaveToFile("拆分PDF/" + f"{start_page + 1}-{end_page + 1}页.pdf")
        # 关闭新创建的PdfDocument对象
        new_pdf.Close()

    # 关闭原始PdfDocument对象
    pdf.Close()

# 调用split_pdf_by_page_count方法将PDF文件按照每3页拆分
split_pdf_by_page_count("心理健康.pdf", 3)

Python 将PDF按指定页数拆分为多个PDF

根据页码范围拆分PDF

除了按页数拆分 PDF 文件外,你还可以选择将指定页码范围内的页面提取为单独的文件。该方法的实现步骤与按指定页数拆分类似,此处不再赘述。

实现代码:

from spire.pdf.common import *
from spire.pdf import *

# 提取PDF中指定页码范围内的页面并保存为新文件的方法
def split_pdf_by_page_range(input_file, start_page, end_page, output_file):
    # 创建PdfDocument对象并加载PDF文件
    pdf = PdfDocument()
    pdf.LoadFromFile(input_file)

    # 创建新的PdfDocument对象
    new_pdf = PdfDocument()

    # 将指定页码范围内的页面插入到新PDF文档中
    new_pdf.InsertPageRange(pdf, start_page, end_page)

    # 保存生成的文件
    new_pdf.SaveToFile(output_file)

    # 关闭PdfDocument对象
    pdf.Close()
    new_pdf.Close()

# 调用split_pdf_by_page_range方法,从PDF文件中提取第1-3页并保存为新文件
split_pdf_by_page_range("心理健康.pdf", 0, 2, "拆分PDF/指定页码范围.pdf")

Python 根据指定页码范围拆分PDF

根据指定内容拆分PDF

在某些情况下,你可能需要根据特定关键字或短语拆分 PDF。这种方法可以提取包含特定内容的页面,便于整理相关信息。以下代码会查找 PDF 每一页上的文本,如果找到指定关键字,则将该页面添加到新 PDF 中:

from spire.pdf.common import *
from spire.pdf import *

# 提取包含特定关键字的页面到新PDF中的方法 
def extract_pages_with_keyword(pdf_path, output_path, keyword):
    # 创建PdfDocument对象
    pdf = PdfDocument()
    # 加载PDF文件
    pdf.LoadFromFile(pdf_path)

    # 创建一个新的PdfDocument对象
    new_pdf = PdfDocument()

    # 遍历文档中的每一页
    for i in range(pdf.Pages.Count):
        page = pdf.Pages[i]
        # 创建PdfTextFinder实例
        finder = PdfTextFinder(page)
        # 定义文本查找参数
        finder.Options.Parameter = TextFindParameter.WholeWord
        # 查找特定文本
        results = finder.Find(keyword)

        # 如果找到了关键字
        if results:
            # 将当前页面添加到新文档中
            new_pdf.InsertPage(pdf, i)
            
    # 保存提取的结果文件
    new_pdf.SaveToFile(output_path)

    # 关闭PdfDocument对象
    new_pdf.Close()
    pdf.Close()

# 调用extract_pages_with_keyword方法将PDF文件中包含特定关键字的页面保存为新文件
extract_pages_with_keyword("心理健康.pdf", "拆分PDF/含关键字页面.pdf", "问题")

PDF的一页拆分为多页

在某些情况下,你可能需要将 PDF 文档的某一页拆分为两页或多页。在拆分时,你可以选择将该页面横向或竖向拆分。横向拆分时,拆分后的文档的每个页面的宽度等于原始宽度的1/拆分总页数;竖向拆分时,拆分后的文档的每个页面的高度等于原始高度的1/拆分总页数。

以下代码展示了如何将PDF文档的指定页面竖向或横向拆分为两页:

from spire.pdf.common import *
from spire.pdf import *

# 将指定PDF页面横向或竖向拆分为多页的方法
def split_specific_pdf_page(pdf_path, output_folder, page_index, num_pages, split_direction='vertical'):
    # 创建PdfDocument对象
    pdf = PdfDocument()
    # 加载PDF文件
    pdf.LoadFromFile(pdf_path)

    # 获取指定页面
    if page_index < 0 or page_index >= pdf.Pages.Count:
        print("错误:指定的页面索引超出范围。")
        return
    
    page = pdf.Pages[page_index]

    # 创建一个新的PdfDocument对象
    newPdf = PdfDocument()
    # 移除所有页面边距
    newPdf.PageSettings.Margins.All = 0.0
    
    # 根据拆分方向设置新PDF的页面尺寸
    if split_direction == 'vertical':
        newPdf.PageSettings.Width = page.Size.Width
        newPdf.PageSettings.Height = page.Size.Height / float(num_pages)
    elif split_direction == 'horizontal':
        newPdf.PageSettings.Height = page.Size.Height
        newPdf.PageSettings.Width = page.Size.Width / float(num_pages)
    else:
        print("错误:无效的拆分方向,请选择'vertical'或'horizontal'。")
        return
    
    # 向新PDF添加一页
    newPage = newPdf.Pages.Add()

    # 设置布局格式为自动分页
    format = PdfTextLayout()
    format.Break = PdfLayoutBreakType.FitPage
    format.Layout = PdfLayoutType.Paginate

    # 绘制内容   
    page.CreateTemplate().Draw(newPage, PointF(0.0, 0.0), format)

    # 保存生成的文件
    newPdf.SaveToFile(f"{output_folder}/拆分第{page_index + 1}页.pdf")

    # 关闭PdfDocument对象
    newPdf.Close()
    pdf.Close()

# 调用split_specific_pdf_page方法将PDF文件第1页竖向拆分为2页,0为当前页面的索引,2为拆分总页数
split_specific_pdf_page("心理健康.pdf", "拆分PDF", 0, 2, 'vertical')  
# # 或者将PDF文件第1页横向拆分为2页
# split_specific_pdf_page("心理健康.pdf", "拆分PDF", 0, 2, 'horizontal') 

以上就是使用Python实现拆分PDF文档的全部内容。感谢阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习--(随机森林,线性回归)

一、集成学习方法之随机森林 集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。集成算法可以说从一方面验证了中国的一句老话&#xff1a;三个臭皮匠&#xff0c;赛过诸葛亮。集成算法大致可以分为&#xff1a;Bagging&#xff0c;B…

STM32【3】芯片的底层组成概论

关于单片机的组成 单片机的意思是&#xff0c;小小计算电脑&#xff0c;麻雀虽小&#xff0c;五脏俱全&#xff0c;里面包含了CPU&#xff0c;ROM&#xff0c;RAM&#xff0c;各种外设。 CPU地位最高&#xff0c;可以访问ROM和RAM&#xff0c;Flash&#xff0c;GPIO等外设&…

Elasticsearch:过滤 HNSW 搜索,快速模式

作者&#xff1a;来自 Elastic Benjamin Trent 通过我们的 ACORN-1 算法实现&#xff0c;探索我们对 Apache Lucene 中的 HNSW 向量搜索所做的改进。 多年来&#xff0c;Apache Lucene 和 Elasticsearch 一直支持使用 kNN 查询的过滤搜索&#xff0c;允许用户检索符合指定元数据…

golang安装(1.23.6)

1&#xff0e;切换到安装目录 cd /usr/local 2&#xff0e;下载安装包 wget https://go.dev/dl/go1.23.6.linux-amd64.tar.gz 3&#xff0e;解压安装包 sudo tar -C /usr/local -xzf go1.23.6.linux-amd64.tar.gz 4&#xff0e;配置环境变量 vi /etc/profile export PATH$…

fastadmin 后台商品sku(vue)

先上个效果图 首先先引入vue define([backend], function (Backend) {require.config({paths: {vue: /assets/jeekshopskugoods/libs/vue.min,skuimg: /assets/jeekshopskugoods/js/skuimg,skugoods: /assets/jeekshopskugoods/js/skugoods,layui: /assets/LayuiSpzj/layui/la…

Ecode前后端传值

说明 在泛微 E9 系统开发过程中&#xff0c;使用 Ecode 调用后端接口并进行传值是极为常见且关键的操作。在上一篇文章中&#xff0c;我们探讨了 Ecode 调用后端代码的相关内容&#xff0c;本文将深入剖析在 Ecode 中如何向后端传值&#xff0c;以及后端又该如何处理接收这些值…

【Linux第一弹】Linux基础指令(上)

目录 1.ls指令 1.1 ls使用实例 2.pwd指令 3.cd指令 3.1 cd使用实例 4.touch指令 4.1touch使用实例 5.mkdir指令 5.1mkdir使用实例 6.rmdir指令和rm指令 6.1 rmdir指令使用实例->: 6.2 rm指令使用实例 7.man指令 8.cp指令 8.1 cp 使用实例 9.mv指令 9.1mv使用…

性能测试测试策略制定|知名软件测评机构经验分享

随着互联网产品的普及&#xff0c;产品面对的用户量级也越来越大&#xff0c;能抗住指数级增长的瞬间访问量以及交易量是保障购物体验是否顺畅的至关重要的一环&#xff0c;而我们的性能测试恰恰也是为此而存在的。 性能测试是什么呢&#xff1f;性能测试要怎么测呢&#xff1f…

面试(进阶) —虚拟列表在什么场景使用,如何实现?

面试(进阶) —虚拟列表在什么场景使用&#xff0c;如何实现&#xff1f; 在前端开发中&#xff0c;当需要渲染大量数据时&#xff0c;传统的渲染方式往往会遇到性能瓶颈。一次性将大量数据渲染到DOM中&#xff0c;不仅会导致页面加载缓慢&#xff0c;还可能占用大量内存&#x…

力扣 寻找重复数

二分&#xff0c;双指针&#xff0c;环形链表。 题目 不看完题就是排序后&#xff0c;用两个快慢指针移动&#xff0c;找到相同就返回即可。 class Solution {public int findDuplicate(int[] nums) {Arrays.sort(nums);int l0;int r1;while(r<nums.length){if(nums[l]num…

爱普生汽车用显示控制器IC:ScalerIC,汽车接口IC,相机接口IC

爱普生汽车显示控制器IC&#xff0c;汽车显示控制器芯片可以分为三类&#xff1a;爱普生显示控制芯片Scaler IC &#xff0c;爱普生汽车接口IC&#xff0c;爱普生相机接口IC。下面就给大家分别介绍下这三类芯片的具体型号的特征及用途。 爱普生显示控制芯片 Scaler IC Scaler…

LIGHTRAG: SIMPLE AND FASTRETRIEVAL-AUGMENTED GENERATION

一、现状问题、解决方法 现状问题&#xff1a; 分块处理在促进检索增强生成过程中起着至关重要的作用(Lyu et al.&#xff0c; 2024)&#xff0c;分块可以显著提高信息检索的准确性。 但是RAG系统还有其他的问题限制他们的能力&#xff1a; 1.很多方法是用二维向量表示数据…

React的TSX中如何同时使用CSS模块的类名和字符串类名

1.有两种类名方法 import React from react; import styles from ./index.less; const Home: React.FC () > {return (<div><h1 classNamemain>Welcome to the Home Page</h1><p className{styles.list}>This is a simple home page.</p>&…

防火墙的智能选路与NAT实验

实验拓扑 配置IP 防火墙的安全区域划分 销售部和运维部不能互相访问&#xff0c;采取vlan的方式来进行隔离。 在配置vlan之后 &#xff0c;两个部门将不会通信。 以上是基础配置&#xff0c;只是演示在各个部门不通的情况下&#xff0c;使用什么技术来进行隔离网络&#xff0c;…

element-ui infiniteScroll 组件源码分享

简单分享 infiniteScroll 组件源码&#xff0c;主要有以下四个方面&#xff1a; 1、infiniteScroll 页面结构。 2、infiniteScroll 组件属性。 3、组件内部的方法。 4、存在的问题。 一、infiniteScroll 页面结构&#xff1a; 二、页面属性。 2.1 infinite-scroll-disab…

【Viewer.js】vue3封装图片查看器

效果图 需求 点击图片放大可关闭放大的 图片 下载 cnpm in viewerjs状态管理方法 stores/imgSeeStore.js import { defineStore } from pinia export const imgSeeStore defineStore(imgSeeStore, {state: () > ({showImgSee: false,ImgUrl: ,}),getters: {},actions: {…

Grafana使用日志7--开启Sigv4

背景 在Grafana中&#xff0c;有些data source是需要开启sigv4认证的&#xff0c;例如OpenSearch&#xff0c;这个配置项默认是关闭的&#xff0c;这里我们介绍一下怎么开启 步骤 传统方式 如果我们想在Grafana中开启sigv4认证&#xff0c;我们需要在grafana.ini中修改一个…

mac下载MAMP6.8.1;解决mac使用小皮面板安装php7.4

因为mac的小皮面板没有php7.4了 链接&#xff1a;c9cc270e6961c17c.dmg官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 鹅选一 附上大佬写的教程&#xff1a;MAMP PRO教程 - 牛奔 - 博客园 更新一下&#xff0c;2-27 昨天已经可以使用php7.4了&#xff0c;我就在想能…

本地部署deepseek大模型后使用c# winform调用(可离线)

介于最近deepseek的大火&#xff0c;我就在想能不能用winform也玩一玩本地部署&#xff0c;于是经过查阅资料&#xff0c;然后了解到ollama部署deepseek,最后用ollama sharp NUGet包来实现winform调用ollama 部署的deepseek。 本项目使用Vs2022和.net 8.0开发&#xff0c;ollam…

spring的15个经典面试题

总结Spring框架的15个经典面试题。 什么是Spring框架&#xff1f; Spring是一种轻量级框架&#xff0c;旨在提高开发人员的开发效率以及系统的可维护性。 我们一般说的Spring框架就是Spring Framework&#xff0c;它是很多模块的集合&#xff0c;使用这些模块可以很方便地协…