最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于QT和百度云api實(shí)現(xiàn)批量獲取PDF局部文字內(nèi)容

 更新時(shí)間:2025年03月11日 09:48:08   作者:平安喜樂-開開心心  
這篇文章將為大家介紹如何使用 QT 構(gòu)建圖形用戶界面,結(jié)合百度云 OCR API 實(shí)現(xiàn)批量獲取 PDF 局部文字內(nèi)容并對(duì)文件進(jìn)行改名的功能,需要的可以參考下

應(yīng)用場(chǎng)景

1. 檔案管理

在企業(yè)或機(jī)構(gòu)的檔案管理中,常常會(huì)有大量的 PDF 格式的文件,如合同、報(bào)告、發(fā)票等。這些文件的原始文件名可能沒有明確的標(biāo)識(shí),不利于查找和管理。通過批量獲取 PDF 局部文字內(nèi)容并改名,可以根據(jù)文件中的關(guān)鍵信息(如合同編號(hào)、報(bào)告標(biāo)題等)為文件重新命名,提高檔案管理的效率。

2. 學(xué)術(shù)資料整理

在學(xué)術(shù)研究中,會(huì)收集大量的學(xué)術(shù)論文、研究報(bào)告等 PDF 文件。這些文件的文件名可能是隨機(jī)生成的或者不具有明確的主題信息。使用本方案可以提取 PDF 中的標(biāo)題、作者等關(guān)鍵信息,為文件重新命名,方便學(xué)者對(duì)學(xué)術(shù)資料進(jìn)行分類和檢索。

實(shí)現(xiàn)方案概述

本方案將使用 QT 構(gòu)建圖形用戶界面,結(jié)合百度云 OCR API 實(shí)現(xiàn)批量獲取 PDF 局部文字內(nèi)容并對(duì)文件進(jìn)行改名的功能。主要步驟包括:使用 QT 選擇 PDF 文件目錄,將 PDF 轉(zhuǎn)換為圖片(因?yàn)榘俣仍?OCR 主要處理圖片),指定局部區(qū)域進(jìn)行 OCR 識(shí)別,獲取識(shí)別結(jié)果作為新文件名,最后對(duì) PDF 文件進(jìn)行重命名。

準(zhǔn)備工作

注冊(cè)百度云賬號(hào):在百度云官網(wǎng)注冊(cè)賬號(hào)并創(chuàng)建 OCR 應(yīng)用,獲取 API Key 和 Secret Key。

安裝 QT:確保已經(jīng)安裝了 QT 開發(fā)環(huán)境。

安裝依賴庫:需要安裝 Poppler 用于 PDF 轉(zhuǎn)圖片,以及 QNetworkAccessManager 用于網(wǎng)絡(luò)請(qǐng)求。

代碼實(shí)現(xiàn)

1. 創(chuàng)建 QT 項(xiàng)目

創(chuàng)建一個(gè)新的 QT Widgets Application 項(xiàng)目。

2. 界面設(shè)計(jì)

在 mainwindow.ui 中設(shè)計(jì)簡單的界面,包含一個(gè)按鈕用于選擇 PDF 文件目錄,一個(gè)文本框用于顯示操作結(jié)果。

3. 代碼實(shí)現(xiàn)

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();
    // 假設(shè)我們要提取的局部區(qū)域(這里需要根據(jù)實(shí)際情況調(diào)整)
    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
 

注意事項(xiàng)

請(qǐng)將 your_api_key 和 your_secret_key 替換為你自己的百度云 OCR API Key 和 Secret Key。

代碼中假設(shè)要提取的局部區(qū)域?yàn)?nbsp;QRect(100, 100, 200, 50),你需要根據(jù)實(shí)際情況

以上就是基于QT和百度云api實(shí)現(xiàn)批量獲取PDF局部文字內(nèi)容的詳細(xì)內(nèi)容,更多關(guān)于QT獲取PDF局部內(nèi)容的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c語言/c++溢出問題淺談

    c語言/c++溢出問題淺談

    這篇文章主要給大家介紹了關(guān)于c語言/c++溢出問題的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 一文詳解C++中的轉(zhuǎn)換構(gòu)造函數(shù)

    一文詳解C++中的轉(zhuǎn)換構(gòu)造函數(shù)

    在 C/C++ 中,不同的數(shù)據(jù)類型之間可以相互轉(zhuǎn)換,無需用戶指明如何轉(zhuǎn)換的稱為自動(dòng)類型轉(zhuǎn)換(隱式類型轉(zhuǎn)換),需要用戶顯式地指明如何轉(zhuǎn)換的稱為強(qiáng)制類型轉(zhuǎn)換,本文就給大家詳細(xì)介紹一下C++的轉(zhuǎn)換構(gòu)造函數(shù),需要的朋友可以參考下
    2023-09-09
  • C++實(shí)現(xiàn)LeetCode(207.課程清單)

    C++實(shí)現(xiàn)LeetCode(207.課程清單)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(207.課程清單),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++11 <future>中std::promise 介紹

    C++11 <future>中std::promise 介紹

    這篇文章主要介紹了C++11 <future>中std::promise 介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 五個(gè)嵌入式C語言中的實(shí)用技巧分享

    五個(gè)嵌入式C語言中的實(shí)用技巧分享

    這篇文章主要和大家分享一下五個(gè)嵌入式C語言中的實(shí)用技巧,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語言有一定的幫助,需要的可以參考一下
    2022-12-12
  • C++刪除指定文件夾下N天及之前日志文件的方法

    C++刪除指定文件夾下N天及之前日志文件的方法

    這篇文章主要介紹了C++刪除指定文件夾下N天及之前日志文件的方法,涉及C++針對(duì)時(shí)間判斷及文件操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • C 語言基礎(chǔ)教程(我的C之旅開始了)[二]

    C 語言基礎(chǔ)教程(我的C之旅開始了)[二]

    C 語言基礎(chǔ)教程(我的C之旅開始了)[二]...
    2007-02-02
  • C語言標(biāo)準(zhǔn)時(shí)間與秒單位相互轉(zhuǎn)換

    C語言標(biāo)準(zhǔn)時(shí)間與秒單位相互轉(zhuǎn)換

    這篇文章主要介紹了C語言標(biāo)準(zhǔn)時(shí)間與秒單位相互轉(zhuǎn)換,秒單位與標(biāo)準(zhǔn)時(shí)間的轉(zhuǎn)換方式,這份代碼一般用在嵌入式單片機(jī)里比較多,比如:設(shè)置RTC時(shí)鐘的時(shí)間,從RTC里讀取秒單位時(shí)間后,需要轉(zhuǎn)換成標(biāo)準(zhǔn)時(shí)間顯示。下文分享需要的小伙伴可以參考一下
    2022-05-05
  • C語言使用ffmpeg實(shí)現(xiàn)單線程異步的視頻播放器

    C語言使用ffmpeg實(shí)現(xiàn)單線程異步的視頻播放器

    這篇文章主要為大家詳細(xì)介紹了C語言如何使用ffmpeg實(shí)現(xiàn)單線程異步的視頻播放器功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-12-12
  • C語言 以字符串的形式讀寫文件詳解及示例代碼

    C語言 以字符串的形式讀寫文件詳解及示例代碼

    本文主要介紹 C語言以字符串的形式讀寫文件,這里提供了詳細(xì)的資料及簡單示例代碼以便大家學(xué)習(xí)參考,有學(xué)習(xí)此部分的小伙伴可以參考下
    2016-08-08

最新評(píng)論

高碑店市| 桐庐县| 克山县| 泰兴市| 南溪县| 乌拉特中旗| 阳西县| 定结县| 利川市| 桦南县| 万源市| 日喀则市| 环江| 汤阴县| 科技| 綦江县| 乌兰浩特市| 郎溪县| 南康市| 晋宁县| 建始县| 石狮市| 莱阳市| 奉化市| 栾城县| 清涧县| 木里| 永平县| 杭锦后旗| 昆山市| 通渭县| 论坛| 达日县| 吉木萨尔县| 吉林市| 阿瓦提县| 平潭县| 敖汉旗| 梁平县| 逊克县| 东方市|