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

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

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

應(yīng)用場景

1. 檔案管理

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

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

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

實現(xiàn)方案概述

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

準備工作

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

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

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

代碼實現(xiàn)

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

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

2. 界面設(shè)計

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

3. 代碼實現(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ù)實際情況調(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
 

注意事項

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

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

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

相關(guān)文章

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

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

    這篇文章主要給大家介紹了關(guān)于c語言/c++溢出問題的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(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)換的稱為自動類型轉(zhuǎn)換(隱式類型轉(zhuǎn)換),需要用戶顯式地指明如何轉(zhuǎn)換的稱為強制類型轉(zhuǎn)換,本文就給大家詳細介紹一下C++的轉(zhuǎn)換構(gòu)造函數(shù),需要的朋友可以參考下
    2023-09-09
  • C++實現(xiàn)LeetCode(207.課程清單)

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

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

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

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

    五個嵌入式C語言中的實用技巧分享

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

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

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

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

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

    C語言標準時間與秒單位相互轉(zhuǎn)換

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

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

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

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

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

最新評論

孝感市| 钟祥市| 明水县| 浦北县| 靖边县| 湖口县| 安福县| 射洪县| 腾冲县| 秦安县| 黄平县| 莒南县| 天长市| 泗阳县| 休宁县| 隆林| 大姚县| 儋州市| 英德市| 建宁县| 永康市| 定西市| 武冈市| 乐都县| 延川县| 洛扎县| 富锦市| 六盘水市| 巴东县| 西峡县| 光泽县| 瓮安县| 抚松县| 隆安县| 白沙| 衡阳市| 茌平县| 土默特左旗| 松溪县| 双流县| 宜兰市|