Python利用PyPDF2快速拆分PDF文档

目录
  • 安装PyPDF2模块
  • 创建文件,准备PDF文档
  • 万事俱备,准备开拆
  • 文档的拆分思路
    • python拆分计算公式:
  • 具体怎么拆?
  • 完整拆分程序:
  • 列表拆分法实现拆分PDF
  • 写在最后

“人生苦短,快学Python”,因为这句口号,我也加入了学习Python的浩浩大军,但由于Python真的是可以做的事情太多了,一时迷了眼,不知道自己应该去专攻哪个方向。

经过多方向试探,我还是选择了广而不深的web开发,Python的web开发自然离不开大名鼎鼎的Django,有一次突发奇想,下载了Django的PDF版文档,心想方便查阅,但懵逼的是PDF版竟然只有英文版,将近1900多页,无奈只能找一些平台的文档翻译功能,大部分需要付费,免费的限制很多,例如免费用户每次最多只能翻译5页,而且文档大小最大不能超过5M到10M。
怎么办?学Python的人会怕这个吗?

拆分,拆分是最好的解决办法,人工去拆吗?1900多页,估计得累死,那么对于Python来说,则非常简单,今天跟随我走入实战,一起学习PyPDF2模块,快速实现拆分,让你真正理解什么叫“人生苦短,我用Python”!

安装PyPDF2模块

这个模块严格区分大小写,y是小写,其余大写

pip3 install PyPDF2

安装完成之后呢,在本地硬盘创建一个专门存放本项目的文件夹,我这里在的存放路径是 F:\Python\PyPDF2,在F盘有个Python文件夹,在其中又创建了一个以这个模块命名的文件夹,来单独存放和与别的项目区分。

创建文件,准备PDF文档

Django官网下载了他的帮助文档,这个文档足够大,1900多页,对于练手绝对够了,有需要的去官网下载,然后再创建一个PDFCF.py 的项目文件。

万事俱备,准备开拆

程序开始两行,写上下边这两句,第一句的意思是指定这个文件的运行程序,第二句是对这个文件的说明,这个的作用现在还看不出来,但如果你知道怎么批量化快速执行程序,你就知道了它的作用,这里不做赘述。

#! python
# PDFCF.py - pdf文件拆分程序

文档的拆分思路

不固定拆分成多少份,但固定每一份由多少页组成,然后来动态的计算拆分的份数,拆分思路有了,那么下来就是列出计算公式。

拆分的份数= 文档总页数 / 拆份每个pdf组成的页数

举个例子:

假如我们要拆分一个总页数为35页的pdf文档,按照每10页组成一个新文档,那么能拆分成多少份的计算公式如下:
3.5 = 35 / 10

这时候大家注意了,除不尽有余数0.5,说明什么?用这个例子来说就是拆分成3份还余下5页,那么遇到这种情况不管余数是几都得向前进1,才能完成整个拆分,这个文档拆分的结果就是,前3个文档每个由10页组成,第四个文档则由最后5页组成,能整除则结果直接就是拆分的份数。

python拆分计算公式:

if 35 % 10:        # 判断是否有余数
    35 // 10 + 1   # 取余数整数部分加1
else:
    0              # 能整除则直接返回0

# 将这个循环写到一行
4 = 35 // 10 + 1 if 35 % 10 else 0

具体怎么拆?

还是以这个35页的文档拆分为例:
循环遍历每一页数据 for num in range(35),得到每一页的数据,之后再指定拆分页数范围进行拆分:

  • 第一个文档从0--10,不包含10
  • 第二个文档从10--20 ,不包含20
  • 第三个文档从 20 -30,不包含30
  • 第四个文档从30--35,不包含35

我们发现规律,每次遍历第一个数字的规律是 一个文档的页数,乘以自己属于第几个便可以得到。第二个数我们发现没规律了,其实仔细观察也有规律,假如我们对拆分个数排序,这个例子就是1--4,第二个数字就是当前属于第几个拆分数乘以每个文档组成的页数(页数是固定的10)。
可是我们第一次遍历的时候从0开始,就让num变得不通用,那么我们改造一下从1开始遍历,range(1,35),从一开始遍历,基于range不包含本身最后一个的特性,这样遍历出来就少了一页文档,那么我们给他加1,变成

  • for num in range(1, 35+1)
  • 第一个文档从10*(1-1)--10*1,不包含10
  • 第二个文档从10*(2-1)--10*2 ,不包含20
  • 第三个文档从 10*(3-1) -10*3, 不包含30
  • 第四个文档从10(4-1)--35

具体遍历代码如下:

for num in range(1,35+1):
    pass
    for i in range(10 * (num-1), 10 * num if num != 4 else 35):
        pass

注意:当遍历到 num = 4(最后一个文档排序数时),直接返回 总页数35就可以了,到这里遍历就结束了。这里为什么是总页数35 而不是35+1呢?是因为此次遍历我们是从0开始遍历的,页码从0开始,所以不需要加1了。

完整拆分程序:

import PyPDF2

# 打开一个可读的pdf对象
pdfReader = PyPDF2.PdfFileReader('django.pdf')
# 获取pdf总页数
pdfnums = pdfReader.numPages
# 每个拆分文档由多少页组成
innumber = 100
# 计算拆分份数
outnums = pdfnums // innumber + 1 if pdfnums % innumber else 0

for num in range(1,pdfnums):
    # 创建空白的pdf
    pdfWriter = PyPDF2.PdfFileWriter()
    # 提取指定页面范围
    for pageNum in range(innumber * (num - 1), innumber * num if num != outnums else pdfnums):
        # 获取到每一页的内容
        pageObj = pdfReader.getPage(pageNum)
        # 将每一页的内容添加到第一次循环创建的空白文档对象中
        pdfWriter.addPage(pageObj)
    # 保存并写入本地文件,并对每个文档重命名
    with open('PDFREAD %s' % num + '.pdf', 'wb') as pdfOutputFile:
        pdfWriter.write(pdfOutputFile)

注意:上边这种拆分思路我个人感觉比较绕,如果你对Python列表的切边以及步长概念理解透彻的话,我觉得不需要这么复杂,只需要把总页码生成一个大列表,再把这个列表利用切片的方法拆分成多个小列表,之后每个拆分的pdf页码范围就是每个小列表第一个数--最后一个数+1,我把我用列表方法实现的代码也贴出来供大家参考。

列表拆分法实现拆分PDF

#! python
# PDFCF.py - pdf文件拆分程序

import PyPDF2
# import LISTCF

# 打开一个可读的pdf对象
pdfReader = PyPDF2.PdfFileReader('django.pdf')
# 获取pdf总页数
pdfnums = pdfReader.numPages

# 将总页码循环到一个列表中
pagenum_list = list(range(pdfnums))

n = 100

# 将总页码按照指定的个数分为多个小列表
page_list = [pagenum_list[i:i + n] for i in range(0, len(pagenum_list), n)]

for i in range(len(page_list)):
  # 创建一个空白的pdf
  pdfWriter = PyPDF2.PdfFileWriter()
  # 提取指定页面
  for pageNum in range(page_list[i][1], page_list[i][-1]+1):
    pageObj = pdfReader.getPage(pageNum)
    pdfWriter.addPage(pageObj)

  with open('PDFREAD %s' % i + '.pdf', 'wb') as pdfOutputFile:
    pdfWriter.write(pdfOutputFile)

怎么用?

在项目文件夹内部按住Shift键,点击鼠标右键,选择在此处打开命令窗口,输入PDFCF.py,回车即可,根据自己的需求去更改 n 的值。

写在最后

给大家分享下我的学习方法,一般在写程序的时候尽量先不动手写,而是先想思路,理清思路,这样会避免在写的过程中磕磕绊绊的情况,这个程序其实并不完美,还可以指定切分数量,自动计算每一页包含多少,还可以只提取多页到多少页这种需求,所以后边这两个需求留给大家思考完成,后边我会贴出自己的代码及思路。

到此这篇关于Python利用PyPDF2快速拆分PDF文档的文章就介绍到这了,更多相关Python 拆分PDF 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python实现简单拆分PDF文件的方法

    本文实例讲述了Python实现简单拆分PDF文件的方法.分享给大家供大家参考.具体如下: 依赖pyPdf处理PDF文件 切分pdf文件 使用方法: 1)将要切分的文件放在input_dir目录下 2)在configure.txt文件中设置要切分的份数(如要切分4份,则设置part_num=4) 3)执行程序 4)切分后的文件保存在output_dir目录下 5)运行日志写在pp_log.txt中 P.S. 本程序可以批量切割多个pdf文件 from pyPdf import PdfFileWri

  • Python利用PyPDF2快速拆分PDF文档

    目录 安装PyPDF2模块 创建文件,准备PDF文档 万事俱备,准备开拆 文档的拆分思路 python拆分计算公式: 具体怎么拆? 完整拆分程序: 列表拆分法实现拆分PDF 写在最后 "人生苦短,快学Python",因为这句口号,我也加入了学习Python的浩浩大军,但由于Python真的是可以做的事情太多了,一时迷了眼,不知道自己应该去专攻哪个方向. 经过多方向试探,我还是选择了广而不深的web开发,Python的web开发自然离不开大名鼎鼎的Django,有一次突发奇想,下载了Dj

  • 如何实用Java实现合并、拆分PDF文档

    前言 处理PDF文档时,我们可以通过合并的方式,来任意组几个不同的PDF文件或者通过拆分将一个文件分解成多个子文件,这样的好处是对文档的存储.管理很方便.下面将通过Java程序代码介绍具体的PDF合并.拆分的方法. 工具:Free Spire.PDF for Java 2.0.0 (免费版) 注:2.0.0版本的比之前的1.1.0版本在功能上做了很大提升,支持所有收费版的功能,只是在文档页数上有一定限制,要求不超过10页,但是对于常规的不是很大的文件,这个类库就非常实用. jar文件导入: 方法

  • Python利用PyPDF2库获取PDF文件总页码实例

    Python中可以利用PyPDF2库来获取该pdf文件的总页码,可以根据下面的方法一步步进行下去: 1.首先,要安装PyPDF2库,利用以下命令即可: pip install PyPDF2 2.接着,就是直接编写代码了,其中我新建了一个py文件,名为file_utils.py,代码如下: from PyPDF2 import PdfFileReader def get_num_pages(file_path): """ 获取文件总页码 :param file_path: 文件

  • C#利用iTextSharp组件给PDF文档添加图片/文字水印

    最近在做关于PDF文档添加水印的功能,折腾了好久,终于好了.以下做个记录: 首先会用到iTextSharp组件,大家可以去官网下载,同时我也会在本文中附加进来. 代码中添加引用为: using System; using System.Collections.Generic; using System.Linq; using System.Text; using iTextSharp.text.pdf; using System.IO; using iTextSharp.text; 创建一个显示

  • 基于Python实现网页文章转PDF文档

    我们有时候看到一篇好的文章,想去保存下来,传统方式一般是收藏书签.复制粘贴到文档或者直接复制链接保存,但这样一次两次还好,数量多了,比较麻烦不说,还可能不好找~ 这个时候,Python的作用就来了,直接抓下来导出为PDF,直接把整个网站的内容都导下来都行~ 话不多说,我们直接上代码! import requests import parsel import pdfkit import os import re html_str = """ <!doctype html&

  • 利用C#如何给PDF文档添加文本与图片页眉

    前言 下面这篇文章向大家分享如何使用了免费组件Free Spire.PDF给PDF文档添加文本和图片页眉.这个组件提供了一些方法,可以帮助我们快速方便地实现此目的. 添加页眉步骤: 首先,创建一个Visual C#控制台项目,添加组件引用并使用以下命名空间. using System; using System.Drawing; using Spire.Pdf; using Spire.Pdf.Graphics; 在下列代码中,我们先定义一个SetDocumentTemplate()方法来创建一

  • ASP.NET Core中快速构建PDF文档的步骤分享第1/2页

    比如我们需要ASP.NET Core 中需要通过PDF来进行某些简单的报表开发,随着这并不难,但还是会手忙脚乱的去搜索一些资料,那么恭喜您,这篇帖子会帮助到您,我们就不会再去浪费一些宝贵的时间. 在本文中我们将要使用DinkToPDF来处理我们在.NET Core Web 程序中进行构建PDF文档!就现在我们不多说,直接开始有趣的部分. 前言# 您可以通过创建PDF文档在我的仓库中,获取源代码,欢迎给个免费的Star... 现在我们创建一个.NET Core 3.0 项目,至于是mvc.Api.

  • 利用python程序生成word和PDF文档的方法

    一.程序导出word文档的方法 将web/html内容导出为world文档,再java中有很多解决方案,比如使用Jacob.Apache POI.Java2Word.iText等各种方式,以及使用freemarker这样的模板引擎这样的方式.php中也有一些相应的方法,但在python中将web/html内容生成world文档的方法是很少的.其中最不好解决的就是如何将使用js代码异步获取填充的数据,图片导出到word文档中. 1. unoconv 功能: 1.支持将本地html文档转换为docx

  • Python实现pdf文档转txt的方法示例

    本文实例讲述了Python实现pdf文档转txt的方法.分享给大家供大家参考,具体如下: 首先,这是一个比较粗糙的版本,因为已经够用了,而且对pdf的格式不熟悉,所以暂时没有进一步优化. 还有,这是转成txt的,所以如果是有图片的pdf是无法保存图片的. 至于本来就是图片的文本,这里是无法分析出来的.那些图片的pdf,估计要用图形匹配的方式来处理,类似于超速拍摄的车牌识别. 不过这样的程度,已经不是文本处理了.扯远了... 转出来的文字,好像按照pdf里面的所展示的来换行了,看不到有什么规则还原

  • 利用python将图片转换成excel文档格式

    前言 本文主要介绍了关于利用python将图片转换成excel文档的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实现步骤 读取图像,获取图像每个像素点的RGB值: 根据每个像素点的RGB值设置excel每个方格的颜色值: 根据像素点的坐标,写入excel文件: 保存退出: 示例代码 from PIL import Image import numpy as np import time import matplotlib.pyplot as plt import

随机推荐