基于QT和百度云api实现批量获取PDF局部文字内容

 更新时间:2025年03月11日 09:48:08   作者:平安喜乐-开开心心  
这篇文章将为大家介绍如何使用 QT 构建图形用户界面,结合百度云 OCR API 实现批量获取 PDF 局部文字内容并对文件进行改名的功能,需要的可以参考下

应用场景

1. 档案管理

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

2. 学术资料整理

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

实现方案概述

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

准备工作

注册百度云账号:在百度云官网注册账号并创建 OCR 应用,获取 API Key 和 Secret Key。

安装 QT:确保已经安装了 QT 开发环境。

安装依赖库:需要安装 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_NAMESPACE
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    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),你需要根据实际情况

以上就是基于QT和百度云api实现批量获取PDF局部文字内容的详细内容,更多关于QT获取PDF局部内容的资料请关注脚本之家其它相关文章!

相关文章

  • C语言修炼之路函数篇真题训练下

    C语言修炼之路函数篇真题训练下

    函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数
    2022-03-03
  • C语言中关于库函数 qsort 快排的用法

    C语言中关于库函数 qsort 快排的用法

    快速排序Qsort是所有学习算法和数据结构最基础的一个部分,也是考试题和面试的一个小重点。本片文章带你了解Qsort的详细用法规则
    2021-09-09
  • C语言代码实现学生成绩管理系统

    C语言代码实现学生成绩管理系统

    这篇文章主要为大家详细介绍了C语言代码实现学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • c语言冒泡排序法代码

    c语言冒泡排序法代码

    c语言冒泡排序法代码,这个是大家最早接触的算法吧,总在写 总在错,学习就是这么个过程, 温故才知新, 望自己谨记
    2013-02-02
  • 详解C++ 中的三种继承方式

    详解C++ 中的三种继承方式

    这篇文章主要介绍了详解C++ 中的三种继承方式,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-03-03
  • C++如何动态的生成对象详解

    C++如何动态的生成对象详解

    C++是不支持根据类名动态地生成对象的,比如从一个文本文件中读取类名然后构造一个对象.主要原因是没有丰富的动态元信息,没有单根类库。那么下面这篇文章就来给大家介绍C++是如何动态的生成对象,有需要的朋友们可以参考借鉴。
    2017-02-02
  • C语言驱动开发之内核通过PEB获取进程参数

    C语言驱动开发之内核通过PEB获取进程参数

    PEB结构(Process Envirorment Block Structure)其中文名是进程环境块信息。本文将通过PEB实现获取进程参数,感兴趣的小伙伴可以了解一下
    2022-10-10
  • C语言实现BMP图像处理(直方图均衡化)

    C语言实现BMP图像处理(直方图均衡化)

    这篇文章主要为大家详细介绍了C语言实现BMP图像直方图均衡化处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C++实现LeetCode(904.水果装入果篮)

    C++实现LeetCode(904.水果装入果篮)

    这篇文章主要介绍了C++实现LeetCode(904.水果装入果篮),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • VC++中图像处理类CBitmap的用法

    VC++中图像处理类CBitmap的用法

    使用VC进行图像处理的时候,CBitmap类为我们提供了丰富的位图处理函数,本文总结了该类的相关函数和常用使用方法,包括加载位图,显示位图,析构CBitmap资源以及在内存中保存位图等内容。
    2015-11-11

最新评论