【人工智能学习-01-01】20250419《数字图像处理》复习材料的word合并PDF,添加页码

news2025/4/20 19:15:26

前情提要

 20250419今天是上师大继续教育人工智能专升本第一学期的第一次线下课。

三位老师把视频课的内容提炼重点再面授。(我先看了一遍视频,但是算法和图像都看不懂,后来就直接挂分刷满时间,不看了)

今天是面对面授课,听不懂我也要聚精会神听,感觉能听懂一点点了。

 

第二位女老师讲授数字图像处理,没有说太多的理论,而是鼓励学生多练习图像处理的代码,获得一定的需求。

1、推荐了飞棠学习网站

2、介绍最新人工智能算法代码

2025

2019

3、介绍一些数字图像处理的实用案例。

 

背景需求:

随后老师分享了部分考试提纲内容,希望学员通过背诵记忆,通过理论考试。

下载后我发现word比较多,而且不是按序排列(第一章、第五章),一个个打开查看不方便。所以我想做成一个PDF

把序号改成第1章、第2章,把题目设置01、把答案写02,这样就能完全按照顺序排列

第1次询问deepseek

 

第一次生成结果

打开后的确是按顺序排列的,供幼56页,但是我发现底部没有页码,这样容易遗失

第2问:如何PDF添加页码

把生成的修改代码(包括页码)运行后,添加页码的部分出现问题

第3问:把出现的错误的截图+源代码一起写入deep seek

AI发现了问题成因,并重新写代码

最终代码

'''
上师大继续教育人工智能-数字图像处理复习题合并+pdf页码
deepseek,阿夏
20250419
'''


import os
from docx2pdf import convert
from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
import io

def convert_docx_to_pdf(input_folder):
    """将指定文件夹中的所有DOCX文件转换为PDF"""
    for filename in os.listdir(input_folder):
        if filename.lower().endswith('.docx'):
            docx_path = os.path.join(input_folder, filename)
            try:
                print(f"正在转换: {filename}")
                convert(docx_path, docx_path.replace('.docx', '.pdf'))
                print(f"转换完成: {filename}")
            except Exception as e:
                print(f"转换 {filename} 时出错: {e}")

def create_page_num_pdf(page_num, total_pages, pagesize):
    """创建包含页码的单个PDF页面"""
    packet = io.BytesIO()
    # 确保pagesize是float类型
    if hasattr(pagesize, '__iter__'):
        pagesize = (float(pagesize[0]), float(pagesize[1]))
    else:
        pagesize = letter
    
    can = canvas.Canvas(packet, pagesize=pagesize)
    
    # 设置页码文本 (底部居中)
    text = f"{page_num}/{total_pages}"
    width, height = pagesize
    can.setFont("Helvetica", 10)  # 设置字体和大小
    can.drawCentredString(width / 2, 20, text)  # 在底部居中位置绘制页码
    
    can.save()
    packet.seek(0)
    return PdfReader(packet)

def add_page_numbers(input_pdf_path, output_pdf_path):
    """为PDF文件添加页码"""
    reader = PdfReader(input_pdf_path)
    writer = PdfWriter()
    total_pages = len(reader.pages)
    
    for page_num in range(total_pages):
        # 获取原始页面
        page = reader.pages[page_num]
        
        # 获取页面尺寸并确保是float类型
        if '/MediaBox' in page:
            media_box = page['/MediaBox']
            pagesize = (float(media_box[2]), float(media_box[3]))
        else:
            pagesize = letter  # 默认使用letter尺寸
        
        # 创建带页码的PDF
        page_num_pdf = create_page_num_pdf(page_num + 1, total_pages, pagesize)
        
        # 将原始页面与页码合并
        page.merge_page(page_num_pdf.pages[0])
        writer.add_page(page)
    
    # 保存带页码的PDF
    with open(output_pdf_path, "wb") as output_pdf:
        writer.write(output_pdf)

def merge_pdfs(input_folder, output_folder, output_filename='20250419(合并打印版本)数字图像处理考试.pdf'):
    """合并指定文件夹中的所有PDF文件并添加页码"""
    # 确保输出文件夹存在
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    merger = PdfWriter()
    pdf_files = []
    
    # 收集所有PDF文件
    for filename in os.listdir(input_folder):
        if filename.lower().endswith('.pdf'):
            pdf_path = os.path.join(input_folder, filename)
            pdf_files.append(pdf_path)
    
    if not pdf_files:
        print("没有找到PDF文件可合并")
        return
    
    # 按文件名排序
    pdf_files.sort()
    
    # 合并PDF
    for pdf in pdf_files:
        try:
            reader = PdfReader(pdf)
            for page in reader.pages:
                merger.add_page(page)
            print(f"已添加: {os.path.basename(pdf)}")
        except Exception as e:
            print(f"添加 {pdf} 时出错: {e}")
    
    # 保存临时合并PDF
    temp_output_path = os.path.join(output_folder, 'temp_' + output_filename)
    final_output_path = os.path.join(output_folder, output_filename)
    
    try:
        with open(temp_output_path, "wb") as temp_pdf:
            merger.write(temp_pdf)
        
        # 为合并后的PDF添加页码
        add_page_numbers(temp_output_path, final_output_path)
        print(f"合并完成并添加页码,保存为: {final_output_path}")
        
        # 删除临时文件
        os.remove(temp_output_path)
    except Exception as e:
        print(f"保存合并PDF时出错: {e}")
    finally:
        pass

def main():
    path = r'D:\人工智能(专升本)\04 202502第一学期\06线下课\20250419 02数字图像处理\数字图像处理考试'
    input_folder = os.path.join(path, '02处理后')
    output_folder = path
    
    # 第一步:转换所有DOCX为PDF
    print("开始转换DOCX文件为PDF...")
    convert_docx_to_pdf(input_folder)
    
    # 第二步:合并所有PDF并添加页码
    print("\n开始合并PDF文件并添加页码...")
    merge_pdfs(input_folder, output_folder)

if __name__ == '__main__':
    main()

 

这次完全成功了

有页码,而且是我想要的那种带有总数(56)的页码

成果运用:发班级群共享

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2338935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Docker 安装 Elastic Stack 并重置本地密码

Elastic Stack(也被称为 ELK Stack)是一个非常强大的工具套件,用于实时搜索、分析和可视化大量数据。Elastic Stack 包括 Elasticsearch、Logstash、Kibana 等组件。本文将展示如何使用 Docker 安装 Elasticsearch 并重置本地用户密码。 ###…

利用 Deepseek 和 Mermaid 画流程图

提示词 你是一个产品经理,请绘制一个报名比赛的流程图,要求生成符合Mermaid语法的代码,具体要求如下: 1.注册账号 2.填写报名信息 3.参加比赛 4.查看比赛结果 生成的结果 flowchart TDA([开始]) --> B[注册账号]B --> C{账…

学习笔记: Mach-O 文件

“结构决定性质,性质决定用途”。如果不了解结构,是很难真正理解的。 通过一个示例的可执行文件了解Mach-O文件的结构 Mach-O基本结构 Header: :文件类型、目标架构类型等Load Commands:描述文件在虚拟内存中的逻辑结构、布局Data: 在Load commands中…

个人自用-导入安装Hexo

因为本人原来就有备份好的资料,所以重新安装起来会很方便,这个教程也只适合我自己用 但是所有的命令行都要在Git的命令行里面使用(因为我就是这样操作的) 1 安装Git Git的官网 Git git --version 这个是查看Git的版本 git --…

《AI大模型应知应会100篇》第26篇:Chain-of-Thought:引导大模型进行步骤推理

第26篇:Chain-of-Thought:引导大模型进行步骤推理 摘要 在自然语言处理(NLP)和人工智能领域,如何让大模型像人类一样进行逐步推理是一个核心挑战。Chain-of-Thought (思维链) 技术的出现为这一问题提供了强有力的解决…

STM32单片机入门学习——第43节: [12-3] 读写备份寄存器实时时钟

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.19 STM32开发板学习——第43节: [12-3] 读写备份寄存器&实时时钟 前言开发板说明…

零基础上手Python数据分析 (18):Matplotlib 基础绘图 - 让数据“开口说话”

写在前面 —— 告别枯燥数字,拥抱可视化力量,掌握 Matplotlib 绘图基础 欢迎来到 “高效数据分析实战指南:Python零基础入门” 专栏! 经过前面 Pandas 模块的学习和实战演练,我们已经掌握了使用 Python 和 Pandas 进行数据处理、清洗、整合、分析的核心技能。 我们能够从…

【网络原理】UDP协议

目录 一. UDP 报文格式 (1)端口号 (2)UDP长度 (3)校验和 UDP协议属于传输层协议,由操作系统内核内置 一. UDP 报文格式 UDP数据报:无连接,不可靠传输,面…

HCIP OSPF综合实验

1.网络拓扑图 实验要求: 2.需求分析 IP规划: 对每个路由器配置ospf并用172.16.0.0/16网段进行划分,项目中一共有area0 - area4五个ospf区域加一个rip网段,所以我们在172.16.0.0/16选出6个网段 ISP 对r5只能配ip可以把他看成外…

实现批量图片文字识别(python+flask+EasyOCR)

话不多说,向上效果图 1)先说框架版本 为什么要先说框架版本呢,因为我在各种版本中尝试了两天,总算确定了如下版本适合我,至于其他的版本,各位自己去尝试 python 3.9.7 EasyOCR 1.7.2 flask 3.0.3 2)执行操作效果图 2.1)多选文件 2.2)图片预览 2.3)提取选中文件 2.4)提取所有文…

【java实现+4种变体完整例子】排序算法中【堆排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格

以下是堆排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格: 一、堆排序基础实现 原理 基于二叉堆结构(最大堆),通过以下步骤实现排序: 构建最大堆:将…

WhatTheDuck:一个基于浏览器的CSV查询工具

今天给大家介绍一个不错的小工具:WhatTheDuck。它是一个免费开源的 Web 应用程序,允许用户上传 CSV 文件并针对其内容执行 SQL 查询分析。 WhatTheDuck 支持 SQL 代码自动完成以及语法高亮。 WhatTheDuck 将上传的数据存储为 DuckDB 内存表,继…

工控系统前端设计(pyqt)

题目源自:白月黑羽的项目实战四-[工控系统前端] 代码已上传至gitcode https://gitcode.com/m0_37662818/Industrial_Control_System_Front_End 心得体会:直接用组态软件或者js吧 项目亮点 tablemodel的使用,绑定了表格和数据风机自定义ite…

剑指Offer(数据结构与算法面试题精讲)C++版——day15

剑指Offer(数据结构与算法面试题精讲)C版——day15 题目一:二叉树最低层最左边的值题目二:二叉树的右侧视图题目三:二叉树剪枝附录:源码gitee仓库 题目一:二叉树最低层最左边的值 题目&#xff…

打靶日记 zico2: 1

一、探测靶机IP(进行信息收集) 主机发现 arp-scan -lnmap -sS -sV -T5 -p- 192.168.10.20 -A二、进行目录枚举 发现dbadmin目录下有个test_db.php 进入后发现是一个登录界面,尝试弱口令,结果是admin,一试就出 得到加…

程序性能(1)嵌入式基准测试工具

程序性能(1)嵌入式基准测试工具 Author:Once Day date: 2025年4月19日 漫漫长路,才刚刚开始… 全系列文档查看:Perf性能分析_Once-Day的博客-CSDN博客 参考文档: CPU Benchmark – MCU Benchmark – CoreMark – EEMBC Embedded Micropr…

LLM MCP模型上下文协议快速入门(for Java)

什么是MCP Model Control Protocol(MCP)是由AI研究机构Anthropic在2023年第二季度首次提出的新型协议规范,旨在解决大语言模型LLM应用中的上下文管理难题。作为LLM交互领域的创新标准,MCP协议在发布后短短一年内已进行了多次更新…

支持向量机(SVM):原理、应用与深入解析

内容摘要 本文深入探讨支持向量机(SVM)。阐述其作为分类算法在小样本、非线性及高维模式识别中的优势,详细介绍SVM基本概念、能解决的问题、核函数作用、对偶问题引入及常见核函数等内容,同时分析其优缺点,并与逻辑回…

chapter32_SpringMVC与DispatcherServlet

一、简介 从本章节开始进入SpringMVC的学习,SpringMVC最重要的类就是DispatcherServlet DispatcherServlet的本质是一个Servlet,回顾一下Servlet JavaWeb就是基于Servlet的Servlet接口有5个方法Servlet实现类是HttpServlet,自定义的Servle…

spring security解析

Spring Security 中文文档 :: Spring Security Reference 1. 密码存储 最早是明文存储,但是攻击者获得数据库的数据后就能得到用户密码。 于是将密码单向hash后存储,然后攻击者利用彩虹表(算法高级(23)-彩虹表&…