本篇继续介绍利用Pdf2pdf库来操作PDF文件的相关内容。主要介绍写新文件,分割,合并pdf文件的实现。
pdf文件的读取,传送门:
Python3-提取pdf文件内容的方式,PyPDF2的使用
pdf文件不能像普通的文本文件,直接进行写入。而是通过其它pdf文件获取到pdf页面,再将这个页面内容写入新的pdf文件中。每一个pdf文件都包含若干个page(页面)。
常用的Class有:
PdfFileReader :用于读取pdf文件;
PdfFileMerger :用于合并pdf文件;
PageObject :pdf页面对象;
PdfFileWriter 用于写入pdf文件。
举例:将一个pdf文件的第一页写入到一个新的pdf文件中。
- # -*- coding: utf-8 -*-
- import PyPDF2
- from PyPDF2 import PdfFileReader
- from PyPDF2 import PdfFileWriter
- import chardet
- from chardet import detect as char_detect
-
- # 写文件
- def write_pdf():
- oldFileName = 'Effective C++ 英文版.pdf'
- newfileName = "Effective C++ 英文版_二页.pdf"
- pageObj = read_one_page(oldFileName);
- # 获取一个 PdfFileWriter 对象
- pdfWriter = PyPDF2.PdfFileWriter()
- # 将一个 PageObject 加入到 PdfFileWriter 中
- pdfWriter.addPage(pageObj)
- # 输出到文件中
- pdfWriter.write(open(newfileName, 'wb'))
-
- #为了验证新的pdf文件,打印的log
- print("============text2222222===============");
- read_one_page(newfileName);
-
- # 读取pdf文件,返回第一页
- def read_one_page(filename):
- ''' 读取pdf文件的内容'''
- pdfFileObj = open(filename, 'rb') #rw,r+都会出错
- # pdfFileObj = open(filename, 'r+',encoding="utf-8")
- pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
-
- print("pages cnt:",pdfReader.numPages)
-
- for i in range(pdfReader.numPages):
- pageObj = pdfReader.getPage(i)
- dataStr = pageObj.extractText()
-
- print("current page index:", i)
- print("============text===============");
- print(dataStr) #ok: 输出
-
- if i ==0:
- return pageObj;
-
- if __name__ == '__main__':
- # test_chardet()
- #filename = "leetcode.pdf"
- #filename = 'Effective C++ 英文版.pdf'
- #read_pdf(filename)
- # read_one_page(filename);
- write_pdf()
说明:
(1)read_one_page:用于读取pdf文件,返回第一页(返回的是 PageObject对象);
(2)write_pdf:写入数据。先调用read_one_page,获取到PageObject对象,再将PageObject对象的数据写入到新的pdf文件中。
(3)pdfWriter.addPage(pageObj):将PageObject对象的数据添加到pdfWriter对象中;
(4)pdfWriter.write:写入到新pdf中。
运行:
% python3 pdf2.py
pages cnt: 251
current page index: 0
============text===============//旧文件的内容
E ffe c tiv eC + +byScottMeyers
Back
to
。。。省略
============text2222222=============== //新文件的内容
pages cnt: 1
current page index: 0
============text===============
E ffe c tiv eC + +byScottMeyers
Back
to
Dedication
。。。省略
如图:
主要通过PdfFileWriter和PdfFileReader来实现。
(1)分割pdf:把一个pdf文件分割成若干个,每一个文件的页数为one_file_page。
实现原理:获取pdf文件,循环获取每一个page,再将每5个page通过PdfFileWriter写入到一个文件中。
代码如下:
- # 分割:把一个pdf文件分割成若干个,每一个文件的页数为one_file_page
- def get_sub_pdf(filename,one_file_page):
- pdf_writer = PdfFileWriter()
- pdf_reader = PdfFileReader(open(filename, 'rb'))
- # 获取 pdf 共用多少页
- page_count = pdf_reader.getNumPages()
- print(page_count)
- # 将 pdf 第五页之后的页面,输出到一个新的文件
- cnt_flag = 0;
- page_cnt = 0;
- for i in range(page_count):
- page_cnt = page_cnt + 1;
- #每一个文件有one_file_page页
- if page_cnt%one_file_page==0:
- pdf_writer.write(open("pdf"+i+".pdf", 'wb'))
- cnt_flag = 0;
- else:
- pdf_writer.addPage(pdf_reader.getPage(i))
- cnt_flag = 1;
- if cnt_flag==1:
- pdf_writer.write(open("pdf"+i+".pdf", 'wb'))
(2)合并多个pdf到一个pdf:把file_list列表中的文件合并到desc_file中
实现原理:读取所有要合并的pdf,循环获取每一个文件的page,再将所有的page通过PdfFileWriter写入到一个新文件中。
代码如下:
- # 合并:把file_list列表中的文件合并到desc_file中
- def merge_pdf(file_list, desc_file):
- pdf_write = PdfFileWriter()
- for file in file_list:
- pdf_reader = PdfFileReader(open(file, 'rb'))
- # 获取 pdf 共用多少页
- page_count = pdf_reader.getNumPages()
- print(page_count)
- for i in range(page_count):
- pdf_write.addPage(pdf_reader.getPage(i))
- pdf_write.write(open(desc_file, 'wb'))