1简介
本篇继续介绍利用Pdf2pdf库来操作PDF文件的相关内容。主要介绍写新文件,分割,合并pdf文件的实现。
pdf文件的读取,传送门:
Python3-提取pdf文件内容的方式,PyPDF2的使用
2 写入PDF文件:
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
。。。省略
如图:
3 分割和合并PDF文件:
主要通过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'))