Python3-pdf文件的相关操作,分割和合并page,PyPDF2的使用

发布于:2023-01-04 ⋅ 阅读:(460) ⋅ 点赞:(0)

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'))

 

本文含有隐藏内容,请 开通VIP 后查看