python不可以处理pdf文件_Python处理PDF文件-简译与总结
最近看到一篇介绍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文件-简译与总结相关推荐
- python不同数据的读入_python读写不同编码txt文件_python读写txt文件
python读写不同编码txt文件_python读写txt文件 以后整理规范 [python] view plaincopy import os import codecs filenames=os. ...
- 用python汇总pdf文件_Python处理PDF文件-简译与总结
最近看到一篇介绍Python中pyPDF模块的文章,详细介绍了使用pyPDF模块获取PDF文件信息,合并拆分PDF文件等功能.很方便,在此搬运分享以下: 全文介绍了以下几方面的功能 提取文件信息 旋转 ...
- python读取pdf文件_python读取pdf文件
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 一.安装pdfminer3k模块?二. 读取pdf文件import sysimp ...
- python教案 md文件_python操作pdf文件.md
``` # -*- coding: utf-8 -*- """ Created on Sat Aug 15 10:20:41 2020 @author: shuib &q ...
- python pdf报告_python生成pdf报告、python实现html转换为pdf报告
1.先说下html转换为pdf:其实支持直接生成,有三个函数pdfkit.f 安装python包:pip Install pdfkit 系统安装wkhtmltopdf:参考 https://githu ...
- python docx 合并文档 图片_Python检查Word文件中包含特定关键字的所有页码
推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社图书详情:配套资源:用书教师可以联系董老师获取教学大纲.课件.源码.教案.考试系 ...
- python如何实现下载文件_python实现下载文件的三种方法
python实现下载文件的三种方法 Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件. ...
- python读取pdf表格_Python 解析 PDF 表格?
需要 该公司的PDF年报包含了各种表,这些表需要在一些特定字幕下解析,称为数据结构. 解决方案 通过查看别人写的博客,我们发现在Python中通常有四种PDF解析: Pdfminer善于分析文字,这种 ...
- python json文件_python读写json文件的简单实现
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...
最新文章
- 【随记】动态调用web服务
- 全民捡破烂,转转和闲鱼谁能胜出?
- C基础(31——35)
- 011_logback中的SMTPAppender
- php文件名函数,php 获取文件名basename()函数的用法总结
- Socket请求获取数据
- 【电子电路】上拉电阻与下拉电阻有什么作用
- 18个不常见的C#关键字,您使用过几个?
- 拔掉数据库的电源会怎样?阿里云数据库新型灾备架构,让云端容灾有“备”无患
- Spark基础学习笔记10:Scala集成开发环境
- 简单地使用jquery的validate
- ​30 岁了,依然一事无成
- Ubuntu下安装uwsgi报错的解决方案
- 关于mysql数据库在输入password后,滴的一声直接退出界面的解决的方法(具体办法)...
- CloudMounter一站式网盘管理工具:将大容量网盘服务巧妙地挂载到系统文件管理器中
- windows自动开关机教程
- Go Slice实现原理分析
- 贝壳找房app使用Glide替换Picasso
- linux命令 ln命令 ln -s命令
- 操作系统基础教程——第六章课后答案