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

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

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值