[Python]使用python处理PDF,在PDF中某一页加一行文字,另存成一个新的文件

本文参考链接:https://blog.csdn.net/Anq1_/article/details/111144032

一、需求分析

我有一个数据文件(data.xlsx),里面是序号和班级信息;还有一个PDF文件,每一页里是格式化的信息,其中包含序号,且序号唯一。遍历PDF每个页面,找到序号对应的班级,加在左下角

 二、实现过程

找了很多方法,都没有在原文件上增加文字的方法,最终使用 PyPDF2, reportlab 库实现,把PDF中某一页与文字合并,另存成新的文件间接实现。

重点关注如何在PDF页面加上一段文字,核心是使用io流作为PyPDF2的PdfReader读取。

from PyPDF2 import PdfReader, PdfWriter, PdfMerger
from reportlab.lib.pagesizes import  A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfgen import canvas

def gen_new_pdf2(index, class_name, no, pdf_path='测试.pdf'):
    """
    把PDF中指定页面加入class_name文本,以下注释为个人理解,没有仔细研讨,仅供参考
    :param index:  原PDF的页面索引
    :param class_name: 文本内容
    :param pdf_path: 原始PDF的路径
    :return: 无
    """
    pdfmetrics.registerFont(TTFont("SimSun", "simsunb.ttf"))  # 设置字体,这个字体对应的文件要放在环境变量所在目录,比如py文件所在的目录,最好选中文字体吧,我当时随便选择了一下
    # 声明输出流
    output = PdfWriter()

    # 创建一个新的 IO流
    packet = io.BytesIO()
    # 使用Reportlab的Canvas创建一个新的PDF,主要用来写文字
    can = canvas.Canvas(packet, pagesize=A4)
    can.setFont("SimSun", 18)  # 设置字体
    can.drawString(50, 50, class_name)  # 输出文本,也可以使用其他方法输出图片等内容
    can.save()  # 保存PDF

    # 流的处理
    packet.seek(0)  # 移动到流的开始位置
    new_pdf = PdfReader(packet)  # 创建一个新的PDF对象,是刚刚生成的PDF,只有一段文字,这样就在内存中生成了一页PDF

    existing_pdf = PdfReader(open(pdf_path, "rb"))  # 打开已有的PDF文件
    page = existing_pdf.pages[index - 1]  # 获取指定页的Page对象,根据index
    # page.rotate(90)   旋转页面,这里旋转了90度,尝试旋转,但效果不理想
    page.merge_page(new_pdf.pages[0])  # 将内存的PDF页与查找出的页面合并,这样就生成了一个新的PDF页,其中包含了一页PDF和一段文字

    # 设置输出,保存文件
    output.add_page(page)  # 添加合并的页面到输出流
    outputStream = open(f"{class_name}/{no}.pdf", "wb")  # 保存文件,文件名自行设置
    output.write(outputStream)  # 写入文件
    outputStream.close()    # 关闭文件

 

posted @ 2024-07-02 17:49  奥卡修罗  阅读(154)  评论(0编辑  收藏  举报