• 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文件中。

    代码如下:

    1. # -*- coding: utf-8 -*-
    2. import PyPDF2
    3. from PyPDF2 import PdfFileReader
    4. from PyPDF2 import PdfFileWriter
    5. import chardet
    6. from chardet import detect as char_detect
    7. # 写文件
    8. def write_pdf():
    9. oldFileName = 'Effective C++ 英文版.pdf'
    10. newfileName = "Effective C++ 英文版_二页.pdf"
    11. pageObj = read_one_page(oldFileName);
    12. # 获取一个 PdfFileWriter 对象
    13. pdfWriter = PyPDF2.PdfFileWriter()
    14. # 将一个 PageObject 加入到 PdfFileWriter 中
    15. pdfWriter.addPage(pageObj)
    16. # 输出到文件中
    17. pdfWriter.write(open(newfileName, 'wb'))
    18. #为了验证新的pdf文件,打印的log
    19. print("============text2222222===============");
    20. read_one_page(newfileName);
    21. # 读取pdf文件,返回第一页
    22. def read_one_page(filename):
    23. ''' 读取pdf文件的内容'''
    24. pdfFileObj = open(filename, 'rb') #rw,r+都会出错
    25. # pdfFileObj = open(filename, 'r+',encoding="utf-8")
    26. pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
    27. print("pages cnt:",pdfReader.numPages)
    28. for i in range(pdfReader.numPages):
    29. pageObj = pdfReader.getPage(i)
    30. dataStr = pageObj.extractText()
    31. print("current page index:", i)
    32. print("============text===============");
    33. print(dataStr) #ok: 输出
    34. if i ==0:
    35. return pageObj;
    36. if __name__ == '__main__':
    37. # test_chardet()
    38. #filename = "leetcode.pdf"
    39. #filename = 'Effective C++ 英文版.pdf'
    40. #read_pdf(filename)
    41. # read_one_page(filename);
    42. 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写入到一个文件中。

    代码如下:

    1. # 分割:把一个pdf文件分割成若干个,每一个文件的页数为one_file_page
    2. def get_sub_pdf(filename,one_file_page):
    3. pdf_writer = PdfFileWriter()
    4. pdf_reader = PdfFileReader(open(filename, 'rb'))
    5. # 获取 pdf 共用多少页
    6. page_count = pdf_reader.getNumPages()
    7. print(page_count)
    8. # 将 pdf 第五页之后的页面,输出到一个新的文件
    9. cnt_flag = 0;
    10. page_cnt = 0;
    11. for i in range(page_count):
    12. page_cnt = page_cnt + 1;
    13. #每一个文件有one_file_page页
    14. if page_cnt%one_file_page==0:
    15. pdf_writer.write(open("pdf"+i+".pdf", 'wb'))
    16. cnt_flag = 0;
    17. else:
    18. pdf_writer.addPage(pdf_reader.getPage(i))
    19. cnt_flag = 1;
    20. if cnt_flag==1:
    21. pdf_writer.write(open("pdf"+i+".pdf", 'wb'))

    (2)合并多个pdf到一个pdf:把file_list列表中的文件合并到desc_file中

    实现原理:读取所有要合并的pdf,循环获取每一个文件的page,再将所有的page通过PdfFileWriter写入到一个新文件中。

    代码如下:

    1. # 合并:把file_list列表中的文件合并到desc_file中
    2. def merge_pdf(file_list, desc_file):
    3. pdf_write = PdfFileWriter()
    4. for file in file_list:
    5. pdf_reader = PdfFileReader(open(file, 'rb'))
    6. # 获取 pdf 共用多少页
    7. page_count = pdf_reader.getNumPages()
    8. print(page_count)
    9. for i in range(page_count):
    10. pdf_write.addPage(pdf_reader.getPage(i))
    11. pdf_write.write(open(desc_file, 'wb'))

     

  • 相关阅读:
    Transformers库总体介绍
    安装TensorRT
    Qt对Opengl的支持情况
    让 CHAT 充分发挥优势
    卷绕工艺与叠片工艺的对比
    LeetCode【4. 寻找两个正序数组的中位数】
    python项目模块打包本地发布并上传到到PyPI官网
    淘宝账号如何快速提升到更高等级
    go nil介绍
    聊天没有表情包被嘲讽,程序员直接用python爬取了十万张表情包
  • 原文地址:https://blog.csdn.net/liranke/article/details/126550963