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

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

时间:2024-07-02 17:53:33浏览次数:1  
标签:文件 另存 import Python pdf PDF page 页面

本文参考链接: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()    # 关闭文件

 

标签:文件,另存,import,Python,pdf,PDF,page,页面
From: https://www.cnblogs.com/aocshallo1/p/18280303

相关文章

  • PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子|附代码数据
    全文下载链接:http://tecdat.cn?p=26519最近我们被客户要求撰写关于LSTM的研究报告,包括一些图形和统计输出。一个简单的编码器-解码器LSTM神经网络应用于时间序列预测问题:预测天然气价格,预测范围为10天。“进入”时间步长也设置为10天。)只需要10天来推断接下来的10天。......
  • 《DNK210使用指南 -CanMV版 V1.0》第七章 基于CanMV的MicroPython语法开发环境搭建
    第七章基于CanMV的MicroPython语法开发环境搭建1)实验平台:正点原子DNK210开发板2)章节摘自【正点原子】DNK210使用指南-CanMV版V1.03)购买链接:https://detail.tmall.com/item.htm?&id=7828013987504)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/......
  • Python对历年高考分数线数据用聚类、决策树可视化分析一批、二批高校专业、位次、计划
    全文链接:https://tecdat.cn/?p=36626原文出处:拓端数据部落公众号随着高等教育的普及与竞争的日益激烈,高考作为通往高等教育的重要门槛,其分数线的波动、高校及专业的选择成为了社会广泛关注的焦点。考生和家长在面临众多高校和专业的选择时,往往需要综合考虑多种因素,如分数线、专......
  • Python--matplotlib绘图可视化知识点整理
    无论你工作在什么项目上,IPython都是值得推荐的。利用ipython--pylab,可以进入PyLab模式,已经导入了matplotlib库与相关软件包(例如Numpy和Scipy),额可以直接使用相关库的功能。本文作为学习过程中对matplotlib一些常用知识点的整理,方便查找。这样IPython配置为使用你所指定的mat......
  • Python爬虫百度文库
    用Python爬取百度文库资料在当今数字化的时代,获取信息变得至关重要。有时我们可能需要从百度文库中获取一些有价值的资料,但手动下载可能效率低下。本文将探讨如何使用Python来爬取百度文库的资料,但需要注意的是,爬取百度文库的资料可能涉及违反其服务条款和法律法规,因此本......
  • python学习-list
    List(列表的定义语法)[元素1,元素2,元素3,......]什么是元素?数据容器内的每一份数据,都称之为元素元素的类型有限制吗?元素的数据类型没有任何限制,甚至元素也可以是列表,这样就定义了嵌套列表但是打印列表里的数值类型是'list'列表的下标(索引)列表的下标(索引)-反向......
  • Python-列表
    列表1.列表Python列表是:任意对象的有序集合:列表是收集其他对象的地方,列表维护了元素的每一项从左到右的顺序,也就是说这是序列;通过偏移访问:像字符串一样,可以通过列表对象的偏移对其进行索引,从而读取对象的某一部分的内容,也可以进行分片和拼接等操作;可变长度、异构以及任意嵌......
  • Python类中的初始化方法理解
    在Python类的初始化方法(__init__方法)中,通常会执行以下操作:1、设置实例属性:这些属性将用于存储与实例相关的数据。属性名通常以self.开头,以便它们可以在类的其他方法中访问。例如:self.attribute_name=value2、传递并存储参数:初始化方法通常会接受参数,这些参数可以用于定制......
  • 【Python机器学习】模型评估与改进——带交叉验证的网格搜索
    虽然将数据划分为训练集、验证集、测试集的方法是可行的,也相对常用,但这种方法对数据的划分相当敏感,为了得到对泛化性能的更好估计,我们可以使用交叉验证来评估每种参数组合的性能,而不是仅将数据单次划分为训练集与验证集。代码表示如下:fromsklearn.svmimportSVCfromsklear......
  • Python创建异步任务队列库之Huey使用详解
    概要Huey是一个简单的Python库,用于创建异步任务队列。它的设计目标是简单易用,同时具备强大的功能。Huey可以轻松地将任务添加到队列中,然后在后台线程中处理这些任务,从而避免阻塞主线程。这使得Huey非常适合处理I/O密集型或长时间运行的任务。此外,Huey还支持任务的......