使用pdfrw库对pdf文件进行读写操作

大家好,前几天分享了一篇读取pdf文章,但是依然无法少部分的pdf进行操作。今天看Python Weekly最新一期推送的文章中《Creating and Manipulate PDFs with pdfrw》,发现该库对pdf操作性能极好,且api更简洁,更适合我这样的小白使用。所以今天我就将该文章翻译一下,做成notebook分享给大家。

在本篇文章中,我们会学到以下内容:

  • 从pdf文件中提取特定的信息

  • 分割pdf文件

  • 合并pdf文件

  • 对pdf中的内容进行旋转

更多功能请查看pdfrw文档

https://github.com/pmaupin/pdfrw#examples

1. 安装

首先我们安装pdfrw库,在终端中输入命令

pip3 install pdfrw

如果你使用的jupyter notebook运行本教程notebook出错提示你没有该库,你需要进行以下操作。

在终端中输入命令

conda install -c nsidc pdfrw

可能网速比较慢,大概1-5min,终端会出现Proceed[y/n],你需要输入y回车

2. 从PDF中提取信息

pdfrw库会从pdf文件中提取并返回pdf文件相关信息,一码胜千言,直接上代码看运行结果可能比我说更好。这里我们使用了w9.pdf文件作为测试文件。

from pdfrw import PdfReader, PdfWriter

def get_pdf_info(path):
   pdf = PdfReader(path)

#PdfReader的关键词keys
   print(pdf.keys())
   print(pdf.Info)
   print(pdf.Root.keys())

#pdf文件页数
   print('PDF has {} pages'.format(len(pdf.pages)))

get_pdf_info('w9.pdf')
['/Root', '/Info', '/ID', '/Size']
{'/Author': '(SE:W:CAR:MP)', '/CreationDate': "(D:20171109144422-05'00')", '/Creator': '(Adobe LiveCycle Designer ES 9.0)', '/Keywords': '(Fillable)', '/ModDate': "(D:20171109144521-05'00')", '/Producer': '(Adobe LiveCycle Designer ES 9.0)', '/SPDF': '(1112)', '/Subject': '(Request for Taxpayer Identification Number and Certification)', '/Title': '(Form W-9 \\(Rev. November 2017\\))'}
['/AcroForm', '/Extensions', '/MarkInfo', '/Metadata', '/Names', '/Pages', '/StructTreeRoot', '/Type', '/Perms']
PDF has 6 pages

呈现方式可能不太友好,继续看下面的内容,pdfrw是不会让你失望的。

3. 分割pdf文件

我们可以使用pdfrw库将pdf文件分割为多份文件。比如,你有可能只想要pdf书籍中的封面,或者你想将这本书按照章节分割为多个文件。这就是pdfrw吸引大邓分享给你的初衷,真的是听强悍的一个pdf操作库。

split函数:

  • path: 待分割的pdf文件路径

  • page:待分割pdf文件第page页

  • output:第page页保存的新pdf文件路径

这里我使用一个 Introduction to Text Mining and Natural Language Processing.pdf 作为例子,将其第一页和第二页分割并保存为第一页.pdf、第二页.pdf两个pdf文件。

def split(path, page, output):
   pdf_obj = PdfReader(path)
   total_pages = len(pdf_obj.pages)

writer = PdfWriter()
   if page <= total_pages:
       writer.addpage(pdf_obj.pages[page])
       writer.write(output)

path = 'Introduction to Text Mining and Natural Language Processing.pdf'
pages = [1, 2]
outputs = ['第一页.pdf', '第二页.pdf']
for page,output in zip(pages, outputs):
   split(path, page, output)

具体效果大家运行后看看文件夹中新生成的第一页.pdf、第二页.pdfIntroduction to Text Mining and Natural Language Processing.pdf做对比,完美的运行实现了我们的分割实验。

4. 合并多个pdf文件

pdfrw可以很容易的将多个pdf文件进行合并,Let's go

在上面的例子中我们创建了concatenate函数,

  • paths参数为待合并的多个pdf文件路径

  • output为合并后pdf文件路径

from pdfrw import PdfReader, PdfWriter, IndirectPdfDict

def concatenate(paths, output):
   writer = PdfWriter()

for path in paths:
       reader = PdfReader(path)
       writer.addpages(reader.pages)

#我们给新的pdf文件加一些看不到的信息。
   #Title、author这些词你可以换成你喜欢的,不会影响程序运行
   #这里我们将这些信息隐藏到新的pdf文件中。
   writer.trailer.Info = IndirectPdfDict(
       Title = '合并pdf文件',
       Author = '生成者:大邓',
       Subject= '多个PDF文件合并',
       HelloPdfrw = '真好用',
       PythonIsFun ='YES')

writer.write(output)

paths = ['第一页.pdf', '第二页.pdf']
concatenate(paths, '合并后的文件.pdf')

我们打开合并后的文件.pdf后,发现确实是对 第一页.pdf、第二页.pdf进行的合并。而且也看不到

Title = '合并pdf文件',
Author = '生成者:大邓',
Subject= '多个PDF文件合并',
HelloPdfrw = '真好用',
PythonIsFun ='YES'

这些信息。

那我们使用get_pdf_info(path)函数查看下合并后的文件.pdf的信息

get_pdf_info('合并后的文件.pdf')
['/Info', '/Root', '/Size']
{'/Author': '<FEFF751F62108005FF1A59279093>', '/HelloPdfrw': '<FEFF771F597D7528>', '/PythonIsFun': '(YES)', '/Subject': '<FEFF591A4E2A00500044004665874EF654085E76>', '/Title': '<FEFF54085E7600700064006665874EF6>'}
['/Pages', '/Type']
PDF has 2 pages

我们发现上面多了

Author/HelloPdfrw/HelloPdfrw/PythonIsFun,

这些关键词都是我自己随便写的,居然都隐藏近新生产的文件了。

这个方法非常棒,比如我以后分享的内容如果以pdf文件保存,我可以将作者信息隐藏到pdf文件中。如果以后谁盗版我的内容,我可以读取这个pdf文件隐藏的信息证明这是我写的。

5. 旋转

有时候你见到的pdf文件某页可能是是旋转90度后的,需要你旋转屏幕才能阅读,那么我们就需要对该pdf文件进行选择。这里我没有这么奇怪的pdf文件,那么我们就对'Introduction to Text Mining and Natural Language Processing.pdf' 文件的奇数页面进行旋转并存储到新的奇数页内容(顺时针旋转90度).pdf,生成奇怪的文件,来试试旋转功能。

from pdfrw import PdfReader, PdfWriter, IndirectPdfDict

def rotate_odd(path, output):

reader = PdfReader(path)
   writer = PdfWriter()
   pages = reader.pages

for page in range(len(pages)):
       if page % 2:
           pages[page].Rotate = 90
           writer.addpage(pages[page])

writer.write(output)

path = 'Introduction to Text Mining and Natural Language Processing.pdf'
output = '奇数页内容(顺时针旋转90度).pdf'
rotate_odd(path, output)

(0)

相关推荐

  • Python办公自动化——提取pdf文件中表格并到Excel

    需求描述 现有一 pdf 文件内容如下,文件中内容主要是表格形式的获奖名单,共158页.现要读取这些表格信息并保存到 excel 文件中. 代码示例: import pdfplumberimport ...

  • Python 方便快捷给 PDF 加水印

    来源:Python 技术「ID: pythonall」 方便快捷给 PDF 加水印 有文字创作需求的同学有时候会需要将自己的作品集结为 PDF 进行分发,一方面帮助自己整理归档,另一方面也有利于作品传 ...

  • C语言编程初学者基础知识学习:文件的读写操作!

    操作文件的正确流程为:打开文件 --> 读写文件 --> 关闭文件. 文件在进行读写操作之前要先打开,使用完毕要关闭. 文件的操作流程我们随时要做到心中有数,今天讲文件的读写. 文件的读写 ...

  • 怎么压缩pdf文件?压缩pdf文件的便捷式操作演示

    或许看到"压缩"二字,大家会觉得小贝今天的话题毫无意义,因为压缩文件谁还不会呢?只需要单击选中文件,点击右键,然后在菜单中选择压缩功能就可以了.不得不承认,一般的文件,WORD.E ...

  • pdf文件需要修改错误内容,pdf怎么转换成word?

    不知道大家有没有遇到这种情况,就是当我们整理好一个pdf格式的文件准备发送给领导或者是同事之类的操作时,临时检查的时候发现文件中有错误的地方,天呐!这对于小编来说虽说是习以为常,但是每每遇到此情况的时 ...

  • pdf文件太大如何变小?

    这生活工作学习中遇到的麻烦事儿可真是不少,就像我们在整理完成一个pdf格式的文件资料后,准备完成最后一步发给领导查阅,但是发现文件太大发送不了!这虽说不是什么大问题,但是成年人的崩溃往往就在一瞬间(手 ...

  • 菜鸟记591-多个工作表工作簿不能转为1个PDF文件?是不是忘了点开选项?

    万一您身边的朋友用得着呢? 各位朋友早上好,小菜继续和您分享经验之谈,截止今日小菜已分享500+篇经验之谈,可以文章编号或关键词进行搜索. 微信推送规则发生改变,如果您想看到小菜每个工作日的经验之谈, ...

  • PDF文件搜索工具PDF Search for Mac

    PDF Search for Mac是Mac平台上一款专业的PDF文件搜索工具,PDF Search Mac版能够帮助用户快速在PDF文档中搜索有需要的指定文本或者内容.有了PDF Search Ma ...

  • 模块一 GO语言基础知识-库源码文件

    你已经使用过 Go 语言编写了小命令(或者说微型程序)吗? 当你在编写"Hello, world"的时候,一个源码文件就足够了,虽然这种小玩意儿没什么用,最多能给你一点点莫名的成就 ...

  • 文件太大影响传输速度,pdf文件过大如何缩小?

    PDF文件过大怎么压缩?PDF是我们工作和学习中常用的文件,但是有些PDF文件内容很多体积很大,打开以及传输都会比较麻烦.有些邮箱或者通讯工具,对传输的文件会有容量的限制,这种时候我们就不得不对文件进 ...

  • pdf文件里有一页多余的内容,如何删除其中一页?

    这pdf的文件是有很多使用优点,当大家想要传输某些文件资料,或者是打印查阅的话很多人都会选择用PDF格式的文件!但是有个问题就是它也有缺点啊,缺点就是难更改,难编辑.就比如我们pdf文件其中有一页是多 ...