在Python中处理PDF文件
在今天的世界中,我们都熟悉PDF文件,因为它们是最广泛使用的数字文档格式之一。PDF的全称是“Portable Document Format”,它使用“.pdf”扩展名保存文档文件。它独立于软硬件或操作系统,可以用于可靠地呈现或交换文档。
PDF是由Adobe发明的,现在是由国际标准化组织维护的开放标准。PDF文件还可以包含链接或按钮表单字段、音视频或其他业务逻辑,以便与用户或查看者更好地交互。
在本教程中,我们将讨论如何执行以下各项操作:
- 从PDF中提取文本
- 旋转PDF页面
- 合并两个PDF文件
- 拆分PDF文件
- 向PDF页面添加水印
我们可以使用一个简单的Python脚本来执行所有这些操作。
安装
为了与PDF文件交互,我们将使用一个第三方模块,即 PyPDF2 . PyPDF2是Python的一个内置库,用作PDF工具包。该模块具备以下功能:
- 可以提取文档的信息,如标题、作者等。
- 可以拆分文档文件的页面。
- 可以裁剪PDF文档文件的页面。
- 可以将多个页面合并为PDF文档文件中的单个页面。
- 可以加密和解密PDF文件。
要安装PyPDF2,可以使用以下命令行命令:
!pip3 install PyPDF2
这个模块的名称是区分大小写的,所以我们必须确保”y”是小写的,并且模块名称中的所有内容都是大写的。
使用PyPDF2模块对PDF文件进行操作
在本节中,我们将讨论如何使用Python的PyPDF2模块对PDF文件进行各种操作。
1. 如何从PDF文档中提取文本
我们可以通过使用Python的PyPDF2模块来提取PDF文件中的文本,使用以下方法。
方法:
为了使用Python从PDF文件中提取文本,我们将按照以下步骤进行操作:
步骤1: 我们将以二进制模式打开名为’exp.pdf’的PDF文件,并将文件对象保存为 pdf_File_Object 。
pdf_File_Object = open('exp.pdf', 'rb')
步骤2: 我们将创建一个 pdf_Reader 对象用于 PDFFileReader 类,通过 PyPDF2 模块的 PDF 文件对象并获取用于读取 PDF 的对象。
pdf_Reader = PDF.PdfFileReader(pdf_File_Object)
步骤3: 获取PDF文档文件中的页面数,我们将使用 numPages
print("No. of pages in the given PDF file: ", pdf_Reader.numPages)
步骤4: 我们将创建一个名为” page_Object “的对象,用于 PageObject 类的 “PyPDF2” 。PDF阅读器对象具有 “getPage()” 函数,该函数以页码作为参数并返回页面的对象。
page_Object = pdf_Reader.getPage(0)
步骤5: 我们将使用页面对象的提取文本函数来从PDF页面中提取文本。
步骤6: 最后,我们将关闭PDF文档文件对象。
pdf_File_Object.close()
代码:
import PyPDF2 as PDF
# Here we will create a pdf file object
pdf_File_Object = open('exp.pdf', 'rb')
# Here, we will creat a pdf reader object
pdf_Reader = PDF.PdfFileReader(pdf_File_Object)
# Now we will print number of pages in pdf file
print("No. of pages in the given PDF file: ", pdf_Reader.numPages)
# Here, create a page object
page_Object = pdf_Reader.getPage(0)
# Now, we will extract text from page
print(page_Object.extractText())
# At last, close the pdf file object
pdf_File_Object.close()
输出:
No. of pages in the given PDF file: 10
GUIDELINES
*
FOR
RE
-
OPENING OF CAMPUS
IN VIEW OF COVID
-
19 PANDEMIC
(FOR
STUDENTS
)
2021
-
22
这在输出中打印了PDF文件的第一页文本。
2. 如何旋转PDF文件页面
我们可以使用Python中的PyPDF2模块旋转PDF文件的页面。
方法:
为了旋转给定PDF文件的页面,我们将使用以下步骤:
步骤1: 我们将为原始PDF创建一个PDF阅读器对象。
步骤2: 我们将将旋转后的页面写入新的PDF文件中。为了写入PDF文件,我们将使用 PyPDF2 的 pdfFileWriter 类的对象。
pdf_Writer = PDF.PdfFileWriter()
步骤3: 我们将遍历原始PDF文档文件的每一页。我们将使用PDF阅读器类的 getPage() 函数获取页面对象,然后使用页面对象类的 rotateClockwise() 函数来旋转页面。
for page in range(pdf_Reader.numPages):
page_Object = pdf_Reader.getPage(page)
page_Object.rotateClockwise(rotation_1)
pdf_Writer.addPage(page_Object)
步骤4: 我们将使用PDF编写器类的 addPage() 函数,通过传入旋转后的页面对象来添加页面PDF编写器对象。
步骤5: 然后,我们将把PDF页面写入新创建的PDF文件中。我们可以通过打开新文件对象并使用PDF编写器对象的 write() 函数来完成这个操作。
new_File = open(new_File_Name, 'wb')
pdf_Writer.write(new_File)
步骤6: 我们将关闭原始PDF文件对象并关闭新创建的新文件对象。
pdf_File_Object.close()
new_File.close()
代码:
# Frst, we will import the modules
import PyPDF2 as PDF
def PDF_rotate(original_File_Name, new_File_Name, rotation_1):
# Then, we will create a pdf File object of original pdf
pdf_File_Object = open(original_File_Name, 'rb')
# Then, we will create a pdf Reader object
pdf_Reader = PDF.PdfFileReader(pdf_File_Object)
# Then we will create a pdf writer object for new pdf
pdf_Writer = PDF.PdfFileWriter()
# Now, we will rotate each page of the PDF document
for page in range(pdf_Reader.numPages):
# Then, we will create rotated page object
page_Object = pdf_Reader.getPage(page)
page_Object.rotateClockwise(rotation_1)
# We will add the rotated page object to pdf writer
pdf_Writer.addPage(page_Object)
# Now we will open a new pdf file object
new_File = open(new_File_Name, 'wb')
# We will write the rotated pages to new file
pdf_Writer.write(new_File)
# At last, we will close the original pdf file object
pdf_File_Object.close()
# And now, we will close the new pdf file object
new_File.close()
def main():
# original pdf file name
original_File_Name = 'exp.pdf'
# new pdf file name
new_File_Name = 'rotated_exp.pdf'
# rotation angle
rotation_1 = 270
# calling the PDF_rotate function
PDF_rotate(original_File_Name, new_File_Name, rotation_1)
if __name__ == "__main__":
# calling the main function
main()
输出:
原始文件:
旋转文件:
3. 如何合并两个PDF文件
我们可以使用Python中的PyPDF2模块来合并两个PDF文件。
方法:
要在Python中合并两个PDF文件,我们将使用以下步骤:
步骤1: 要合并两个PDF文件,我们将使用一个预构建的类, pdfFileMerger 和 PyPDF2
我们将创建一个名为pdf_Merger
的PDF合并器类的对象:
pdf_Merger = PDF.PdfFileMerger()
步骤2: 然后,我们将每个PDF的文件对象附加到PDF合并器对象中,使用 append()
for pdf in pdf:
pdf_Merger.append(pdf)
步骤3: 最后,我们将使用PDF合并对象的写入方法将pdf页面写入输出pdf文件中。
with open(output_1, 'wb') as K:
pdf_Merger.write(K)
代码:
# First, we will import the modules
import PyPDF2 as PDF
def PDF_merge(pdf, output_1):
# Here, we will create pdf file merger object
pdf_Merger = PDF.PdfFileMerger()
# now, we will append pdfs one by one
for pdf in pdf:
pdf_Merger.append(pdf)
# then, we will write combined pdf to output pdf file
with open(output_1, 'wb') as K:
pdf_Merger.write(K)
def main():
# here, we will select the pdf files to merge
pdf = ['exp.pdf', 'rotated_exp.pdf']
# Here, we will create output pdf file name
output_1 = 'combined_exp.pdf'
# Now, we will call pdf merge function
PDF_merge(pdf = pdf, output_1 = output_1)
if __name__ == "__main__":
# At last we will call the main function
main()
输出:
这段代码的输出将以合并后的PDF形式呈现,文件名为 combined_exp.pdf ,它是通过合并 exp.pdf 和 rotate_exp.pdf 文件得到的。
4. 如何分割PDF文件
我们可以使用PyPDF2模块根据我们的需求来分割PDF文档文件。
在这段代码中,我们不会使用新的函数或类,而是使用简单的逻辑和迭代。根据我们传递的分割列表splits_1,将会创建PDF的分割部分。
代码:
# First, we will import the modules
import PyPDF2 as PDF
def PDF_split(pdf_1, splits_1):
# here, we will create an input pdf file object
pdf_File_Object = open(pdf_1, 'rb')
# here, we will create pdf reader object
pdf_Reader = PDF.PdfFileReader(pdf_File_Object)
# Now we will start indexing of first slice
start = 0
# then we will start indexing of last slice
end = splits_1[0]
for g in range(len(splits_1) + 1):
# we will create pdf writer object for (g + 1)th split
pdf_Writer = PDF.PdfFileWriter()
# output pdf file name
output_pdf = pdf_1.split('.pdf')[0] + str(g) + '.pdf'
# Now, we will add pages to pdf writer object
for page_1 in range(start, end):
pdf_Writer.addPage(pdf_Reader.getPage(page_1))
# Here, we will write split pdf pages to pdf file
with open(output_pdf, "wb") as K:
pdf_Writer.write(K)
# Now, we will interchange page split start position for next split
start = end
try:
# then, we will set split end position for next split
end = splits_1[g + 1]
except IndexError:
# then, we will set split end position for last split
end = pdf_Reader.numPages
# Now, we will close the input pdf file object
pdf_File_Object.close()
def main():
# pdf file to split
pdf_1 = 'exp.pdf'
# split page positions
splits_1 = [2,4]
# we will call PDF_split function to split pdf
PDF_split(pdf_1, splits_1)
if __name__ == "__main__":
# at last, we will call the main function
main()
输出:
此代码的输出将生成3个新的pdf文件,这些文件是主pdf的拆分文件。我们可以在PDF文件夹中查看。它包含3个新的pdf文件。
5. 如何给PDF页面添加水印
我们可以使用Python的PyPDF2模块给PDF文档文件的页面添加水印。
方法:
在这个方法中,我们会按照页面旋转的例子中的每一步操作,唯一的区别是:
wm_page_Object = add_watermark(user_watermark, pdf_Reader.getPage(page_1))
页面对象将通过使用 add_watermark() 函数转换为水印页面对象。
要了解 add_watermark() 函数的作用,我们可以看下面的示例:
wm_File_Object = open(wm_File, 'rb')
pdf_Reader = PDF.PdfFileReader(wm_File_Object)
page_Object.mergePage(pdf_Reader.getPage(0))
wm_File_Object.close()
return page_Object
首先,我们创建了一个water_mark.pdf文件的pdf阅读器对象。对于传递的页面对象,我们使用了mergepage()函数,该函数传递了water_mark pdf阅读器对象的第一个页面对象。这将导致在传递的页面对象上覆盖water_mark pdf。
代码:
# First, we will import the modules
import PyPDF2 as PDF
def add_watermark_1(wm_File, page_Object):
# here, we will open watermark pdf file
wm_File_Object = open(wm_File, 'rb')
# Now, we will create pdf reader object of watermark pdf file
pdf_Reader = PDF.PdfFileReader(wm_File_Object)
# then, we will merge watermark pdf's first page with passed page object.
page_Object.mergePage(pdf_Reader.getPage(3))
# Here, we will close the watermark pdf file object
wm_File_Object.close()
# we will return watermarked page object
return page_Object
def main():
# Now, we will create watermark pdf file name
user_watermark = 'water_mark.pdf'
# original pdf file name
original_File_Name = 'exp.pdf'
# new pdf file name
new_File_Name = 'watermarked_exp.pdf'
# now, we will create pdf File object of original pdf
pdf_File_Object = open(original_File_Name, 'rb')
# here, we will create a pdf Reader object
pdf_Reader = PDF.PdfFileReader(pdf_File_Object)
# create a pdf writer object for new pdf
pdf_Writer = PDF.PdfFileWriter()
# add watermark to each page
for page_1 in range(pdf_Reader.numPages):
# Now, we will create watermarked page object
wm_page_Object = add_watermark(user_watermark, pdf_Reader.getPage(page_1))
# then, we will add watermarked page object to pdf writer
pdf_Writer.addPage(wm_page_Object)
# new pdf file object
new_File = open(new_File_Name, 'wb')
# we will then write watermarked pages to new file
pdf_Writer.write(new_File)
# close the original pdf file object
pdf_File_Object.close()
# close the new pdf file object
new_File.close()
if __name__ == "__main__":
# call the main function
main()
输出:
water_mark.pdf:
user_watermark.pdf 文件:
以上代码将生成一个带有<strong>user_Watermark.pdf</strong>
水印的文件,该水印来自<strong>water_mark.pdf</strong>
文件。
结论
在本教程中,我们讨论了如何使用Python及其模块的函数和方法对PDF文件进行不同的操作。