最近看到一篇介绍Python中pyPDF模块的文章,详细介绍了使用pyPDF模块获取PDF文件信息,合并拆分PDF文件等功能。很方便,在此搬运分享以下:

全文介绍了以下几方面的功能

提取文件信息

旋转页面

合并文件

拆分文件

添加水印

加密文件

这里我主要尝试了前几个功能的实现,添加水印与加密文件不是很用得上就不再详细尝试了。

pyPdf,PyPDF2以及PyPDF4的发展历程

最初的pyPdf模块发布与2005年,但并不支持Python3。PyPDF2目前也基本停用,最新版本的PyPDF4支持PyPDF2的大多数功能,但也有部分功能不兼容。原文中使用的是PyPDF2模块,此处我改用最新的PyPDF4进行尝试。

安装

如果你已经安装了Anaconda,可以使用pip或者conda直接安装:

pip install PyPDF4

功能实现

提取PDF文件信息

我们可以通过PdfFileReader来实现对以下信息的提取:

作者

创建者

生产商

主题

题目

页数

代码如下:

from PyPDF4 import PdfFileReader,PdfFileWriter

def extract_information(pdf_path):

with open(pdf_path,'rb') as f:

pdf=PdfFileReader(f)

information=pdf.getDocumentInfo()

number_of_pages=pdf.getNumPages()

txt=f"""

Information about {pdf_path}

Author: {information.author}

Creator: {information.creator}

Producer: {information.producer}

Subject: {information.subject}

Title: {information.title}

Number of pages: {number_of_pages}

"""

print(txt)

return information

if __name__ == '__main__':

path='visa_letter.pdf'

extract_information(path)

主要通过getDocumentInfo()与getNumPages()两个函数来实现读取信息的功能。如果想进一步读取PDF中的文本信息,可以参照PDFMiner.six(Python3支持)

if __name__ == '__main__'则放在自己创建的模块底部,指明当该模块作为main函数调用时的执行情况。

旋转页面

旋转页面功能需要导入PdfFileWriter模块,上文中以导入,此处不再重复,代码如下:

def rotate_pages(pdf_path,pages=[0],direction='right'):

"""Parameters: filename, pages want to rotate and rotate direction"""

pdf_writer=PdfFileWriter()

pdf_reader=PdfFileReader(pdf_path)

outputname=pdf_path[:-4]+'-rotate.pdf'

for page in pages:

# Rotate page 90 degrees to the right

if direction=='right':

page_r=pdf_reader.getPage(page).rotateClockwise(90)

pdf_writer.addPage(page_r)

# Rotate page 90 degrees to the left

elif direction=='left':

page_r=pdf_reader.getPage(page).rotateCounterClockwise(90)

pdf_writer.addPage(page_r)

else:

print("Encountered an improper argument! Input right or left.")

with open(outputname,'wb') as fh:

pdf_writer.write(fh)

旋转页码通过getPage()和rotateClockwise() rotateCounterClockwise()实现,getPage()获取要旋转页的索引,rotateClockwise() rotateCounterClockwise()控制旋转方向。

addPage()将要输出的页添加到流(不清楚该如何严谨表述,依稀记得C++里是这么称呼的)中,最后的新文件通过write()创建。

这里我将原文的函数改进了以下,加入两个表明要旋转的页码以及旋转方向的关键字参数,页码通过列表传递,默认将第一页顺时针旋转90度。

这里的else情况似乎抛出个异常更为合理,但我还没有掌握异常的处理方法。

合并文件

合并文件的核心则是对每个文件的每一页进行枚举,再逐次添加到流里,最后统一输出:

def merge_pdfs(paths,output):

pdf_writer=PdfFileWriter()

for path in paths:

pdf_reader=PdfFileReader(path)

for page in range(pdf_reader.getNumPages()):

pdf_writer.addPage(pdf_reader.getPage(page))

with open(output,'wb') as out:

pdf_writer.write(out)

要合并的文件以列表的形式传入即可。

拆分文件

这里遇到了个问题,使用PyPDF4在拆分循环中会出现PdfFileWriter' object has no attribute 'stream'的错误,似乎是个bug。

这可能是因为将读入文件步骤写在了循环外导致写出过程紊乱,在循环内再此读入文件可以解决,详情见PyPDF2 PdfFileWriter has no attribute stream。

PyPDF2有时也会遇到同样的错误,但此处使用PyPDF2不会有该错误。

def split(pdf_path,name_of_split):

pdf_reader=PdfFileReader(pdf_path)

for page in range(pdf_reader.getNumPages()):

pdf_reader=PdfFileReader(pdf_path)

pdf_writer=PdfFileWriter()

pdf_writer.addPage(pdf_reader.getPage(page))

output=f'{name_of_split}{page}.pdf'

with open(output,'wb') as output_pdf:

pdf_writer.write(output_pdf)

总结

至此一个具有简易功能的PDF编辑器就基本实现了,在使用时可以将PDFeditor.py最后一部分修改为:

def main():

pass

if __name__ == '__main__':

main()

防止直接调用,具体调用方法则为:

import PDFeditor

split('visa_letter.pdf','s')

merge_pdfs(['s0.pdf','s1.pdf'],'m.pdf')

rotate_pages('m.pdf',[0,1],'left')

extract_information('m.pdf')

用python汇总pdf文件_Python处理PDF文件-简译与总结相关推荐

  1. python不同数据的读入_python读写不同编码txt文件_python读写txt文件

    python读写不同编码txt文件_python读写txt文件 以后整理规范 [python] view plaincopy import os import codecs filenames=os. ...

  2. python读取pdf文件_python读取pdf文件

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 一.安装pdfminer3k模块?二. 读取pdf文件import sysimp ...

  3. python不可以处理pdf文件_Python处理PDF文件-简译与总结

    最近看到一篇介绍Python中pyPDF模块的文章,详细介绍了使用pyPDF模块获取PDF文件信息,合并拆分PDF文件等功能.很方便,在此搬运分享以下: 全文介绍了以下几方面的功能 提取文件信息 旋转 ...

  4. python教案 md文件_python操作pdf文件.md

    ``` # -*- coding: utf-8 -*- """ Created on Sat Aug 15 10:20:41 2020 @author: shuib &q ...

  5. python pdf报告_python生成pdf报告、python实现html转换为pdf报告

    1.先说下html转换为pdf:其实支持直接生成,有三个函数pdfkit.f 安装python包:pip Install pdfkit 系统安装wkhtmltopdf:参考 https://githu ...

  6. python读取pdf表格_Python 解析 PDF 表格?

    需要 该公司的PDF年报包含了各种表,这些表需要在一些特定字幕下解析,称为数据结构. 解决方案 通过查看别人写的博客,我们发现在Python中通常有四种PDF解析: Pdfminer善于分析文字,这种 ...

  7. python处理pdf 层_Python处理PDF及生成多层PDF实例代码

    Python提供了众多的PDF支持库,本文是在Python3环境下,试用了两个库来完成PDF的生成的功能.PyPDF对于读取PDF支持较好,但是没找到生成多层PDF的方法.Reportlab看起来更成 ...

  8. python合并csv文件_PYTHON合并CSV文件的实践

    最近尝试使用PYTHON处理CSV数据,由于CSV文件有好几个,需要提前拼接,然后再处理,因此遇到了PYTHON对文件进行合并的问题.此次尝试了两种方法:一是调用CMD命令处理:二是使用PYTHON写 ...

  9. python读xml文件生成头文件_Python根据指定文件生成XML的方法

    因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看.其原始文件默认使用逗号进行分隔,如下所示: 第1个值:原始图片中切图小文件,以AIpng_x,其中x代表 ...

最新文章

  1. 记一次面试经过-----映客
  2. windows php swoole 安装
  3. 【数据结构第一周】最大子列和问题整理
  4. Java 洛谷 P1002 过河卒讲解
  5. Python多线程介绍及实例
  6. python怎么编写视觉识别_Python视觉识别--OpenCV色彩空间\图像运算\ROI(四)
  7. eclipse xml文件报错_Maven教程6: Maven与Eclipse整合
  8. THU – team players 合作精神
  9. 第一模块:Python基础(二)
  10. Interfaces
  11. 深度学习-吴恩达-笔记-5-深度学习的实践层面
  12. Java多线程编程(1)--Java中的线程
  13. oracle应用程序开发,关于Oracle 数据库应用程序开发问题
  14. XLNET:换一个思路做预训练,效果杠杠滴
  15. kbmmw 的HTTPSmartService中的跨域访问
  16. 收入增速环比抬升!从业务数据透视运营商转型战略布局
  17. dwg图纸的预览功能
  18. 【嵌入式百科】003——时钟周期、指令周期、机器周期、总线周期
  19. 重启tomcat命令
  20. Codeforces - 1166E - The LCMs Must be Large

热门文章

  1. 实操教程|详细记录solov2的ncnn实现和优化
  2. 重磅直播|GDR-Net:基于几何信息指导的单目6D物体姿态估计算法(CVPR2021作者开讲啦)...
  3. 如何用视觉的方法量身高?
  4. python学习一(python与pip工具下载与安装)
  5. 计算机网络连接设备的有什么,常用网络连接设备有哪些?
  6. 基于机器学习的临床决策支持-ANN
  7. 第五课.Python函数(二)
  8. MPB:山大倪金凤组-黄翅大白蚁肠道放线菌的分离与培养
  9. ggplot2版聚类物种丰度堆叠图
  10. QIIME 2用户文档. 20命令行界面q2cli(2019.7)