【PDF提取局部内容改名】批量获取PDF局部文字内容改名 基于QT和百度云api的完整实现方案

应用场景

1. 档案管理

在企业或机构的档案管理中,常常会有大量的 PDF 格式的文件,如合同、报告、发票等。这些文件的原始文件名可能没有明确的标识,不利于查找和管理。通过批量获取 PDF 局部文字内容并改名,可以根据文件中的关键信息(如合同编号、报告标题等)为文件重新命名,提高档案管理的效率。

2. 学术资料整理

在学术研究中,会收集大量的学术论文、研究报告等 PDF 文件。这些文件的文件名可能是随机生成的或者不具有明确的主题信息。使用本方案可以提取 PDF 中的标题、作者等关键信息,为文件重新命名,方便学者对学术资料进行分类和检索。

实现方案概述

本方案将使用 QT 构建图形用户界面,结合百度云 OCR API 实现批量获取 PDF 局部文字内容并对文件进行改名的功能。主要步骤包括:使用 QT 选择 PDF 文件目录,将 PDF 转换为图片(因为百度云 OCR 主要处理图片),指定局部区域进行 OCR 识别,获取识别结果作为新文件名,最后对 PDF 文件进行重命名。

准备工作

  1. 注册百度云账号:在百度云官网注册账号并创建 OCR 应用,获取 API Key 和 Secret Key。
  2. 安装 QT:确保已经安装了 QT 开发环境。
  3. 安装依赖库:需要安装 Poppler 用于 PDF 转图片,以及 QNetworkAccessManager 用于网络请求。

代码实现

1. 创建 QT 项目

创建一个新的 QT Widgets Application 项目。

2. 界面设计

在 mainwindow.ui 中设计简单的界面,包含一个按钮用于选择 PDF 文件目录,一个文本框用于显示操作结果。

3. 代码实现

cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QDir>
#include <QProcess>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QImage>
#include <QPixmap>
#include <QPainter>
#include <poppler/qt5/poppler-qt5.h>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);connect(ui->selectDirButton, &QPushButton::clicked, this, &MainWindow::selectDirectory);networkManager = new QNetworkAccessManager(this);connect(networkManager, &QNetworkAccessManager::finished, this, &MainWindow::onNetworkReplyFinished);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::selectDirectory()
{QString dir = QFileDialog::getExistingDirectory(this, tr("Select Directory"), "", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);if (!dir.isEmpty()) {QDir directory(dir);QStringList filters;filters << "*.pdf";QStringList pdfFiles = directory.entryList(filters, QDir::Files);for (const QString &pdfFile : pdfFiles) {QString pdfPath = directory.filePath(pdfFile);processPDF(pdfPath);}}
}void MainWindow::processPDF(const QString &pdfPath)
{Poppler::Document *document = Poppler::Document::load(pdfPath);if (!document || document->isLocked()) {ui->resultTextEdit->append("Failed to load PDF: " + pdfPath);delete document;return;}Poppler::Page *page = document->page(0);if (!page) {ui->resultTextEdit->append("Failed to get page from PDF: " + pdfPath);delete document;return;}QImage image = page->renderToImage();// 假设我们要提取的局部区域(这里需要根据实际情况调整)QRect region(100, 100, 200, 50);QImage croppedImage = image.copy(region);QByteArray imageData;QBuffer buffer(&imageData);buffer.open(QIODevice::WriteOnly);croppedImage.save(&buffer, "JPEG");buffer.close();QString apiKey = "your_api_key";QString secretKey = "your_secret_key";QString tokenUrl = QString("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%1&client_secret=%2").arg(apiKey).arg(secretKey);QNetworkRequest tokenRequest(QUrl(tokenUrl));networkManager->get(tokenRequest);pdfPaths.append(pdfPath);imageDatas.append(imageData);delete page;delete document;
}void MainWindow::onNetworkReplyFinished(QNetworkReply *reply)
{if (reply->error() == QNetworkReply::NoError) {QByteArray responseData = reply->readAll();QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData);QJsonObject jsonObj = jsonDoc.object();if (jsonObj.contains("access_token")) {QString accessToken = jsonObj["access_token"].toString();if (!pdfPaths.isEmpty() && !imageDatas.isEmpty()) {QString pdfPath = pdfPaths.takeFirst();QByteArray imageData = imageDatas.takeFirst();QString ocrUrl = QString("https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=%1").arg(accessToken);QNetworkRequest ocrRequest(QUrl(ocrUrl));ocrRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");QByteArray postData;postData.append("image=").append(QUrl::toPercentEncoding(imageData.toBase64()));networkManager->post(ocrRequest, postData);}} else if (jsonObj.contains("words_result")) {QJsonArray wordsResult = jsonObj["words_result"].toArray();QString newFileName;for (const auto &result : wordsResult) {QJsonObject wordObj = result.toObject();newFileName += wordObj["words"].toString();}if (!pdfPaths.isEmpty()) {QString pdfPath = pdfPaths.takeFirst();QFileInfo fileInfo(pdfPath);QString newFilePath = fileInfo.dir().filePath(newFileName + ".pdf");QFile::rename(pdfPath, newFilePath);ui->resultTextEdit->append("Renamed: " + pdfPath + " to " + newFilePath);}}} else {ui->resultTextEdit->append("Network error: " + reply->errorString());}reply->deleteLater();
}
4. 头文件 mainwindow.h

cpp

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QList>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void selectDirectory();void onNetworkReplyFinished(QNetworkReply *reply);private:Ui::MainWindow *ui;QNetworkAccessManager *networkManager;QList<QString> pdfPaths;QList<QByteArray> imageDatas;void processPDF(const QString &pdfPath);
};
#endif // MAINWINDOW_H

注意事项

  • 请将 your_api_key 和 your_secret_key 替换为你自己的百度云 OCR API Key 和 Secret Key。
  • 代码中假设要提取的局部区域为 QRect(100, 100, 200, 50),你需要根据实际情况调整该区域。
  • 本方案依赖于 Poppler 库进行 PDF 转图片操作,需要确保该库已正确安装并配置。

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

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

相关文章

无人机PX4飞控 | PX4源码添加自定义uORB消息并保存到日志

PX4源码添加自定义uORB消息并保存到日志 0 前言 PX4的内部通信机制主要依赖于uORB&#xff08;Micro Object Request Broker&#xff09;&#xff0c;这是一种跨进程的通信机制&#xff0c;一种轻量级的中间件&#xff0c;用于在PX4飞控系统的各个模块之间进行高效的数据交换…

XCCL、NCCL、HCCL通信库

XCCL提供的基本能力 XCCL提供的基本能力 不同的XCCL 针对不同的网络拓扑&#xff0c;实现的是不同的优化算法的&#xff08;不同CCL库最大的区别就是这&#xff09; 不同CCL库还会根据自己的硬件、系统&#xff0c;在底层上面对一些相对应的改动&#xff1b; 但是对上的API接口…

Docker快速部署高效照片管理系统LibrePhotos搭建私有云相册

文章目录 前言1.关于LibrePhotos2.本地部署LibrePhotos3.LibrePhotos简单使用4. 安装内网穿透5.配置LibrePhotos公网地址6. 配置固定公网地址 前言 想象一下这样的场景&#xff1a;你有一大堆珍贵的回忆照片&#xff0c;但又不想使用各种网盘来管理。怎么办&#xff1f;别担心…

【Java计算机毕业设计】基于Springboot的物业信息管理系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

深入解析Python机器学习库Scikit-Learn的应用实例

深入解析Python机器学习库Scikit-Learn的应用实例 随着人工智能和数据科学领域的迅速发展&#xff0c;机器学习成为了当下最炙手可热的技术之一。而在机器学习领域&#xff0c;Python作为一种功能强大且易于上手的编程语言&#xff0c;拥有庞大的生态系统和丰富的机器学习库。其…

高斯光束介绍及光斑处理

常规激光器的光斑为高斯光斑&#xff0c;即中心能量集中&#xff0c;边缘能量较低。一般定义光强的处为高斯光束的半径。高斯光斑的传输由光斑半径、远场发散角、波长等决定。 其中为位置z处的光斑半径&#xff0c;w(z), k2pi/λ为波矢&#xff0c;λ为光波长&#xff0c;R为高…

C++哈希(链地址法)(二)详解

文章目录 1.开放地址法1.1key不能取模的问题1.1.1将字符串转为整型1.1.2将日期类转为整型 2.哈希函数2.1乘法散列法&#xff08;了解&#xff09;2.2全域散列法&#xff08;了解&#xff09; 3.处理哈希冲突3.1线性探测&#xff08;挨着找&#xff09;3.2二次探测&#xff08;跳…

【Redis】List 类型的介绍和常用命令

1. 介绍 Redis 中的 list 相当于顺序表&#xff0c;并且内部更接近于“双端队列”&#xff0c;所以也支持头插和尾插的操作&#xff0c;可以当做队列或者栈来使用&#xff0c;同时也存在下标的概念&#xff0c;不过和 Java 中的下标不同&#xff0c;Redis 支持负数下标&#x…

携程Java开发面试题及参考答案 (200道-上)

说说四层模型、七层模型。 七层模型(OSI 参考模型) 七层模型,即 OSI(Open System Interconnection)参考模型,是一种概念模型,用于描述网络通信的架构。它将计算机网络从下到上分为七层,各层的功能和作用如下: 物理层:物理层是计算机网络的最底层,主要负责传输比特流…

IM 即时通讯系统-51-MPush开源实时消息推送系统

IM 开源系列 IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术&#xff0c;提供优质可控的IMRTC能力 IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统 IM 即时通讯系统-43-简单的仿QQ聊天安卓APP IM 即时通讯系统-44-仿QQ即…

AlexNet论文代码阅读

论文标题&#xff1a; ImageNet Classification with Deep Convolutional Neural Networks 论文链接&#xff1a; https://volctracer.com/w/BX18q92F 代码链接&#xff1a; https://github.com/dansuh17/alexnet-pytorch 内容概述 训练了一个大型的深度卷积神经网络&#xf…

扩散模型(三)

相关阅读&#xff1a; 扩散模型&#xff08;一&#xff09; 扩散模型&#xff08;二&#xff09; Latent Variable Space 潜在扩散模型&#xff08;LDM&#xff1b;龙巴赫、布拉特曼等人&#xff0c;2022 年&#xff09;在潜在空间而非像素空间中运行扩散过程&#xff0c;这…

git基础使用--4---git分支和使用

文章目录 git基础使用--4---git分支和使用1. 按顺序看2. 什么是分支3. 分支的基本操作4. 分支的基本操作4.1 查看分支4.2 创建分支4.3 切换分支4.4 合并冲突 git基础使用–4—git分支和使用 1. 按顺序看 -git基础使用–1–版本控制的基本概念 -git基础使用–2–gti的基本概念…

8.攻防世界Web_php_wrong_nginx_config

进入题目页面如下 尝试弱口令密码登录 一直显示网站建设中&#xff0c;尝试无果&#xff0c;查看源码也没有什么特别漏洞存在 用Kali中的dirsearch扫描根目录试试 命令&#xff1a; dirsearch -u http://61.147.171.105:53736/ -e* 登录文件便是刚才登录的界面打开robots.txt…

【漫话机器学习系列】076.合页损失函数(Hinge Loss)

Hinge Loss损失函数 Hinge Loss&#xff08;合页损失&#xff09;&#xff0c;也叫做合页损失函数&#xff0c;广泛用于支持向量机&#xff08;SVM&#xff09;等分类模型的训练过程中。它主要用于二分类问题&#xff0c;尤其是支持向量机中的优化目标函数。 定义与公式 对于…

python算法和数据结构刷题[5]:动态规划

动态规划&#xff08;Dynamic Programming, DP&#xff09;是一种算法思想&#xff0c;用于解决具有最优子结构的问题。它通过将大问题分解为小问题&#xff0c;并找到这些小问题的最优解&#xff0c;从而得到整个问题的最优解。动态规划与分治法相似&#xff0c;但区别在于动态…

本地Deepseek添加个人知识库(Page Assist/AnythingLLM)

本地Deepseek两种方法建立知识库 前言 &#xff08;及个人测试结论&#xff09;法一、在Page Assist建立知识库step1 下载nomic-embed-textstep2 加载进Page Assiststep3 添加知识step4 对话框添加知识库 法二、在AnythingLLM建立知识库准备工作1.下载nomic-embed-text2.下载An…

记8(高级API实现手写数字识别

目录 1、Keras&#xff1a;2、Sequential模型&#xff1a;2.1、建立Sequential模型&#xff1a;modeltf.keras.Sequential()2.2、添加层&#xff1a;model.add(tf.keras.layers.层)2.3、查看摘要&#xff1a;model.summary()2.4、配置训练方法&#xff1a;model.compile(loss,o…

grpc 和 http 的区别---二进制vsJSON编码

gRPC 和 HTTP 是两种广泛使用的通信协议&#xff0c;各自适用于不同的场景。以下是它们的详细对比与优势分析&#xff1a; 一、核心特性对比 特性gRPCHTTP协议基础基于 HTTP/2基于 HTTP/1.1 或 HTTP/2数据格式默认使用 Protobuf&#xff08;二进制&#xff09;通常使用 JSON/…

文字投影效果

大家好&#xff0c;我是喝西瓜汁的兔叽&#xff0c;今天给大家分享一个常见的文字投影效果。 效果展示 我们来实现一个这样的文字效果。 思路分析 这样的效果如何实现的呢? 实际上是两组相同的文字&#xff0c;叠合在一块&#xff0c;只不过对应的css不同罢了。 首先&…