APP下载
报价宝  ›  科技  › 

Python基础学习教程:Python玩转PDF各种骚操作大全

报价宝 来源:baojiabao.com 发布时间:2019-11-23 23:56:00 10月02日更新
报价宝综合消息Python基础学习教程:Python玩转PDF各种骚操作大全

Python基础学习教程:Python玩转PDF各种骚操作大全!

Portable Document Format(可移植文件格式),或者PDF是一种档案格式,可以用于跨操作系统的呈现和文件交换。尽管PDF最初是由Adobe发明的,但它现在是由国际标准化组织(ISO)维护的开放标准。你可以通过使用PyPDF2包在Python中处理已先存在的PDF。

PyPDF2是一个纯Python包,可用于许多不同型别的PDF操作。

这里一篇Python基础学习教程带你了解如何执行以下操作:

从Python中提取PDF中的文件资讯旋转页面合并PDF拆分PDF新增水印加密PDFPyPdf PyPDF2 PyPDF4的历史

最初的pyPdf软件包于2005年释出。pyPdf的最后一个正式版本是在2010年。大约一年后,一家名为Phasit的公司赞助了一个名为PyPDF2的pyPdf分支。该程式码编写为向后与原始程式码相容,并且用了好多年,效果一直很好,其最后一个版本是在2016年。

有一个名为PyPDF3的软件包简短系列版本,然后该专案被重新命名为PyPDF4。所有这些专案都完全相同,但pyPdf和PyPDF2 +之间的最大区别在于后者版本增加了Python 3支援。Python 3的原始pyPdf有一个不同的Python 3分支,但是这个分支已经多年没有维护了。

虽然最近放弃了PyPDF2,但新的PyPDF4与PyPDF2没有完全的向后相容性。本文中的大多数示例都可以与PyPDF4完美配合,但也有一些不能,这就是为什么PyPDF4在本文中没有更多的特色。随意用PyPDF4替换PyPDF2的汇入,看看它是如何工作的。

pdfrw:一个替代的PDF操作包

Patrick Maupin建立了一个名为pdfrw的软件包,它可以完成许多与PyPDF2相同的工作。除了加密的特殊情况外,本文后面提到PyPDF2的所有操作,pdfrw均可以实现。

pdfrw的最大区别在于它与ReportLab软件包整合,因此你可以使用一些或所有预先存在的PDF构建一个新的PDF。

PyPDF2的安装

如果使用Anaconda而不是常规Python,可以使用pip或conda安装PyPDF2。以下是使用pip安装PyPDF2的方法:

$ pip install pypdf2

由于PyPDF2没有任何依赖,因此安装非常快。

如何从Python****中提取PDF文件资讯

我们可以使用PyPDF2从PDF中提取元资料和一些文字,尤其是当在预先存在的PDF档案上执行某些型别的自动化时是非常有用的。

以下是当前可以提取的资料型别:

AuthorCreatorProducerSubjectTitleNumber of page可以在自己的电脑上随便找一个PDF档案进行尝试操作。下面是使用该PDF编写一些程式码,并了解如何访问这些属性:

from PyPDF2 import PdfFileReader

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 = \'xxxx.pdf\'

extract_information(path)

首先从PyPDF2包汇入PdfFileReader。PdfFileReader是一个具有多种与PDF档案互动的方法的类。在此示例中,我们呼叫了.getDocumentInfo,它将返回DocumentInformation的例项,包含了我们感兴趣的大部分资讯。我们还可以在reader物件上呼叫.getNumPages,让它返回文件中的页数。

information这个变数具有多个例项属性,可以使用这些属性从文件中获取所需的其余元资料。我们可以打印出该资讯并将其返回以备将来使用。

虽然PyPDF2具有.extractText,可以在其页面物件上使用提取文字(本例中未显示),但它的效果不是很好。有些PDF会返回文字,有些会返回空字串。如果要从PDF中提取文字,建议应该看一下PDFMiner专案。PDFMiner更加强大,专门用于从PDF中提取文字。

如何旋转页面?

有时候PDF是横向模式而不是纵向模式,甚至是颠倒的。当有人扫描文件为PDF或电子邮件时,很可能会发生这种情况。我们可以打印出文件并阅读纸质版本,也可以使用Python的强大功能来旋转有问题的页面。

下面看一下如何使用PyPDF2旋转文章的一些页面:

from PyPDF2 import PdfFileReader, PdfFileWriter

def rotate_pages(pdf_path):

pdf_writer = PdfFileWriter

pdf_reader = PdfFileReader(path)

# 顺时针旋转90度

page_1 = pdf_reader.getPage(0).rotateClockwise(90)

pdf_writer.addPage(page_1)

# 逆时针旋转90度

page_2 = pdf_reader.getPage(1).rotateCounterClockwise(90)

pdf_writer.addPage(page_2)

# 在正常方向上新增一页

pdf_writer.addPage(pdf_reader.getPage(2))

with open(\'rotate_pages.pdf\', \'wb\') as fh:

pdf_writer.write(fh)

if __name__ == \'__main__\':

path = \'新路径.pdf\'

rotate_pages(path)

上面除了pdfileReader之外,还汇入了pdfileWriter,因为我们需要编写一个新的pdf。rotate_pages获取要修改的PDF的路径。在这个函式中,需要建立一个可以命名为pdf-writer的writer物件和一个名为pdf-reader的reader物件。

接下来,可以使用.get page获取所需的页面。上面开始输入了第0页,也就是第一页,呼叫page物件的.rotateClockwise顺时针旋转方法并输入90。然后同样地,对于第二页,呼叫.rotateCounterLockwise逆时针旋转并输入90。

每次呼叫Rotation旋转方法后,都会呼叫.addPage,这将向writer物件新增页面的旋转版本。最后一页是第3页,没有对其进行任何旋转。最后,使用.write把所有新页写入新的PDF。

如何合并PDF?

在许多情况下,我们希望将两个或多个PDF合并到一个PDF中。例如,现在可能有一个标准的封面,需要转到许多型别的报告中。这时候就可以使用python来帮助完成这类工作。

下面是实现的程式码,完成PDF合并的操作:

from PyPDF2 import PdfFileReader, PdfFileWriter

def merge_pdfs(paths, output):

pdf_writer = PdfFileWriter

for path in paths:

pdf_reader = PdfFileReader(path)

for page in range(pdf_reader.getNumPages):

# 将每页新增到writer物件

pdf_writer.addPage(pdf_reader.getPage(page))

# 写入合并的pdf

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

pdf_writer.write(out)

if __name__ == \'__main__\':

paths = [\'document1.pdf\', \'document2.pdf\']

merge_pdfs(paths, output=\'merged.pdf\')

假如有一个要合并到一起的pdf列表时,可以直接使用merge_pdf函式完成。此函式采用了输入路径和输出路径作为引数。

首先遍历输入的paths,并为每个输入建立一个PDF阅读物件。然后遍历PDF档案中的所有页面,并使用.addpage将这些页面写入writer物件。当完成对列表中所有PDF的所有页面的写入后,将在末尾写入新的结果中。

如果不想合并每个PDF的所有页面,可以通过新增一系列要新增的页面来稍微增强这个指令码。挑战一点的话,也可以使用Python的argparse模组为这个函式建立一个命令列界面。

如何拆分PDF?

有时可能需要将PDF拆分为多个PDF,对于包含大量扫描内容的PDF来说尤其重要。以下是如何使用PyPDF2将PDF拆分为多个档案:

from PyPDF2 import PdfFileReader, PdfFileWriter

def split(path, name_of_split):

pdf = PdfFileReader(path)

for page in range(pdf.getNumPages):

pdf_writer = PdfFileWriter

pdf_writer.addPage(pdf.getPage(page))

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

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

pdf_writer.write(output_pdf)

if __name__ == \'__main__\':

path = \'xxx.pdf\'

split(path, \'jupyter_page\')

这个函式中再次建立了PDF的reaer物件,并对其所读取的页面进行遍历。对于PDF中的每个页面,建立一个新的PDF的writer例项并向其新增单个页面。然后,将该页面写入一个唯一命名的档案。指令码执行完毕后,就可以将原始PDF的每个页面拆分为单独的PDF。

如何新增水印?

水印是纸质或者电子文件上的影象或图案,一些水印只能在特殊照明条件下才能看到。水印的重要性在于它可以保护你的知识产权,例如影象或PDF。

我们可以使用Python和PyPDF2为文件新增水印,而且是拥有仅包含水印影象或文字的PDF。下面是向PDF新增水印方法:

from PyPDF2 import PdfFileWriter, PdfFileReader

def create_watermark(input_pdf, output, watermark):

watermark_obj = PdfFileReader(watermark)

watermark_page = watermark_obj.getPage(0)

pdf_reader = PdfFileReader(input_pdf)

pdf_writer = PdfFileWriter

# 给所有页面新增水印

for page in range(pdf_reader.getNumPages):

page = pdf_reader.getPage(page)

page.mergePage(watermark_page)

pdf_writer.addPage(page)

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

pdf_writer.write(out)

if __name__ == \'__main__\':

create_watermark(

input_pdf=\'Jupyter_Notebook_An_Introduction.pdf\',

output=\'watermarked_notebook.pdf\',

watermark=\'watermark.pdf\')

上面create_watermark有三个引数:

input_pdf:要加水印的PDF档案路径output:要储存PDF的水印版本的路径watermark:包含水印影象或文字的PDF在程式码中,开启水印PDF并从文件中抓取第一页,因为这是水印应该驻留的位置。然后使用input_pdf和通用pdf_writer物件建立PDF的writer物件,以写出带水印的PDF。

下一步是遍历input_pdf中的页面,然后呼叫.mergePage并以用上面读取的水印物件watermark_page为引数,这样会将watermark_page覆盖在当前页面的顶部,然后再将新合并的页面新增到pdf_writer物件中。遍历完成后,最后将新加水印的PDF写入磁盘。

如何加密PDF?

PyPDF2目前仅支援将使用者密码和所有者密码新增到预先存在的PDF。在PDF版本中,所有者密码会提供PDF的管理员许可权,并允许设定文件的许可权,而使用者密码只允许开启文件。

实际上,PyPDF2是不允许设定文件的任何许可权的,即使它允许设定所有者密码的情况下。但无论如何,这是可以加密的方式,也将固有地加密PDF:

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):

pdf_writer = PdfFileWriter

pdf_reader = PdfFileReader(input_pdf)

for page in range(pdf_reader.getNumPages):

pdf_writer.addPage(pdf_reader.getPage(page))

pdf_writer.encrypt(user_pwd=password, owner_pwd=None,

use_128bit=True)

with open(output_pdf, \'wb\') as fh:

pdf_writer.write(fh)

if __name__ == \'__main__\':

add_encryption(input_pdf=\'reportlab-sample.pdf\',

output_pdf=\'reportlab-encrypted.pdf\',

password=\'twofish\')

add_encryption以输入输出PDF路径和要新增到PDF的密码为引数。由于需要加密整个输入PDF,因此需要遍历其所有页面并将其新增到writer编写器。最后一步是呼叫.encrypt,以使用者密码,所有者密码以及是否应该新增128位加密为引数。预设情况下,要启用128位加密。如果将其设定为False,则将应用40位加密。

结论

PyPDF2包非常有用,可以使用PyPDF2自动执行指令码完成PDF文件的批量操作。本文介绍了如何从PDF中提取元资料,旋转页面,合并和拆分PDF,新增水印,以及新增加密的操作。

同时,还要关注较新的PyPDF4包,因为它很快就会取代PyPDF2。也可以看看pdfrw包,它也可以执行许多与PyPDF2相同的操作。

文章标签: 报价宝 降噪耳机价格 耳机价格 红米手机价格 华为手机价格 小米手机价格 电视机价格 笔记本电脑价格 笔记本价格 汽车价格 笔记本价格 电视机价格 小米手机价格 耳机价格 降噪耳机价格