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


Posted in Python onApril 03, 2020

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: 文件路径
 :return:
 """
 reader = PdfFileReader(file_path)
 # 不解密可能会报错:PyPDF2.utils.PdfReadError: File has not been decrypted
 if reader.isEncrypted:
  reader.decrypt('')
 page_num = reader.getNumPages()
 return page_num

3、这样就可以获得该pdf文件的总页数了,但是需要传递文件路径进去,因为需要读取这个文件。

4、以上内容仅供学习参考,谢谢!

补充知识:使用python合并pdf文件带书签

1、需求:

将几本纸质书进行了扫描,可是扫描的每页生成一个pdf文件。需要怎么才能把这些pdf文件合成一个呢?adoba acrobat工具支持,可是收费。我们平时用的都是adoba reader,只有读pdf的功能没有合并等高级功能。网上的一些免费工具又担心有病毒或绑定程序。

所以考虑看看pyton实现。网上找了下python合并pdf的脚本,发现也没有添加书签的功能的,有添加书签的也不是很灵活。

所有对网上找的一个python程序进行了升级,可以实现合并pdf并每个章节加入书签。

文件准备:

先将扫描的pdf文件,每一章放到一个文件夹中,文件夹名字用章节名命名。这样最终程序就能将章节名作为书签了,而不是默认将每页都生成书签。

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

2、程序代码

代码运行环境:python3

需要安装PyPDF2包:pip install PyPDF2

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
 本脚本用来合并pdf文件,支持带一级子目录的
 每章内容分别放在不同的目录下,目录名为章节名
 最终生成的pdf,按章节名生成书签
'''

import os, sys, codecs
from PyPDF2 import PdfFileReader, PdfFileWriter, PdfFileMerger
import glob

def getFileName(filepath):
 '''
  获取当前目录下的所有pdf文件
 '''
 file_list = glob.glob(filepath+"/*.pdf")
 # 默认安装字典序排序,也可以安装自定义的方式排序
 # file_list.sort()
 return file_list


def get_dirs(filepath='', dirlist_out=[], dirpathlist_out=[]):
 # 遍历filepath下的所有目录
 for dir in os.listdir(filepath):
  dirpathlist_out.append(filepath + '\\' + dir)

 return dirpathlist_out


def merge_childdir_files(path):
 '''
  每个子目录下合并生成一个pdf
 '''
 dirpathlist = get_dirs(path)
 if len(dirpathlist) == 0:
  print("当前目录不存在子目录")
  sys.exit()
 for dir in dirpathlist:
  mergefiles(dir, dir)


def mergefiles(path, output_filename, import_bookmarks=False):
 # 遍历目录下的所有pdf将其合并输出到一个pdf文件中,输出的pdf文件默认带书签,书签名为之前的文件名
 # 默认情况下原始文件的书签不会导入,使用import_bookmarks=True可以将原文件所带的书签也导入到输出的pdf文件中
 merger = PdfFileMerger()
 filelist = getFileName(path)
 if len(filelist) == 0:
  print("当前目录及子目录下不存在pdf文件")
  sys.exit()
 for filename in filelist:
  f = codecs.open(filename, 'rb')
  file_rd = PdfFileReader(f)
  short_filename = os.path.basename(os.path.splitext(filename)[0])
  if file_rd.isEncrypted == True:
   print('不支持的加密文件:%s'%(filename))
   continue
  merger.append(file_rd, bookmark=short_filename, import_bookmarks=import_bookmarks)
  print('合并文件:%s'%(filename))
  f.close()
 # out_filename = os.path.join(os.path.abspath(path), output_filename)
 merger.write(output_filename + ".pdf")
 print('合并后的输出文件:%s'%(output_filename))
 merger.close()

if __name__ == "__main__":
 # 每个章节一个子目录,先分别合并每个子目录文件为一个pdf,然后再将这些pdf合并为一个大的pdf,这样做目的是想生成每个章节的书签

 # 1.指定目录
 # 原始pdf所在目录
 path = "D:\spdf"
 # 输出pdf路径和文件名
 output_filename = "D:\spdf\战略规划 公司实现持续成功的方法、工具和实践 罗熙昶 2018-09"

 # 2.生成子目录的pdf
 # merge_childdir_files(path)

 # 3.子目录pdf合并为总的pdf
 mergefiles(path, output_filename)

3、程序使用

将要生成的pdf文件目录导入到程序指定目录下,例如我程序中的path是“D:\spdf”,然后指定最终输出的文件路径及文件名,我上面的output_filename是"D:\spdf\战略规划 公司实现持续成功的方法、工具和实践 罗熙昶 2018-09"

数据结果如下:

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

以上这篇Python利用PyPDF2库获取PDF文件总页码实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python开发之for循环操作实例详解
Nov 12 Python
Python按行读取文件的实现方法【小文件和大文件读取】
Sep 19 Python
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 Python
使用Python+Splinter自动刷新抢12306火车票
Jan 03 Python
Python 获得命令行参数的方法(推荐)
Jan 24 Python
python pandas 对series和dataframe的重置索引reindex方法
Jun 07 Python
Python Pywavelet 小波阈值实例
Jan 09 Python
python 图像平移和旋转的实例
Jan 10 Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 Python
Python3 mmap内存映射文件示例解析
Mar 23 Python
Pytest如何使用skip跳过执行测试
Aug 13 Python
python语言time库和datetime库基本使用详解
Dec 25 Python
Numpy 理解ndarray对象的示例代码
Apr 03 #Python
python计算Content-MD5并获取文件的Content-MD5值方式
Apr 03 #Python
Django自定义列表 models字段显示方式
Apr 03 #Python
使用Django清空数据库并重新生成
Apr 03 #Python
Python基础类继承重写实现原理解析
Apr 03 #Python
Django实现列表页商品数据返回教程
Apr 03 #Python
Python第三方库的几种安装方式(小结)
Apr 03 #Python
You might like
[EPIC] Larva vs Flash ZvT @ Crossing Field [2017-10-09]
2020/03/17 星际争霸
php中的时间处理
2006/10/09 PHP
?繁体转换的class
2006/10/09 PHP
一步一步学习PHP(1) php开发环境配置
2010/02/15 PHP
怎样搭建PHP开发环境
2015/07/28 PHP
用js实现的抽象CSS圆角效果!!
2007/05/03 Javascript
javascript 有趣而诡异的数组
2009/04/06 Javascript
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
用队列模拟jquery的动画算法实例
2015/01/20 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
Vue2.x中的父子组件相互通信的实现方法
2017/05/02 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
python实现问号表达式(?)的方法
2013/11/27 Python
在Python中编写数据库模块的教程
2015/04/29 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
tensorflow 中对数组元素的操作方法
2018/07/27 Python
python使用tomorrow实现多线程的例子
2019/07/20 Python
Pytorch 中retain_graph的用法详解
2020/01/07 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
非凡女性奢华谦虚风格:The Modist
2017/10/28 全球购物
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
幼儿教师研修感言
2014/02/12 职场文书
2014年两会学习心得体会
2014/03/10 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android
win10此电脑打不开怎么办 win10双击此电脑无响应的解决办法
2022/07/23 数码科技