图片PDF区域信息批量提取至Excel,基于QT和阿里云api的实现方案

办公文档处理:在企业日常办公中,经常会遇到大量的扫描文档(如发票、合同、报表等)以图片或 PDF 格式存储。需要将这些文档中的特定区域信息(如发票金额、合同条款、报表数据等)提取出来,整理到 Excel 表格中,以便进行数据分析、统计和进一步处理。

数据采集与整理:对于从事数据采集工作的人员,从各种图片和 PDF 资料中提取特定区域的信息,并汇总到 Excel,能够快速整合数据,为后续的数据挖掘和分析提供基础。

详细代码步骤

  1. 创建 QT 项目并配置环境

    • 打开 QT Creator,创建一个新的 Qt Widgets Application 项目。
    • 在项目的.pro文件中添加以下内容:

    QT += network
    LIBS += -L/path/to/libxlsxwriter -lxlsxwriter

  • 请将/path/to/libxlsxwriter替换为实际的libxlsxwriter库路径。
  1. 读取图片和 PDF 文件

    • 对于图片,使用QPixmap类读取。
    • 对于 PDF 文件,使用 Poppler 库(需要先安装 Poppler 库并在项目中配置好)。以下是读取 PDF 并将其转换为图片的示例代码:

    #include <Poppler/Document.h>
    #include
    #include

    QPixmap pdfPageToPixmap(const QString& pdfFilePath, int pageNumber) {
    Poppler::Document* doc = Poppler::Document::load(pdfFilePath);
    if (!doc || doc->isLocked()) {
    delete doc;
    return QPixmap();
    }
    doc->setRenderHint(Poppler::Document::Antialiasing);
    doc->setRenderHint(Poppler::Document::TextAntialiasing);
    QPixmap pixmap = doc->page(pageNumber)->renderToPixmap(300, 300);
    delete doc;
    return pixmap;
    }

  2. 调用阿里云 API 进行文字识别

    • 首先,需要构建 HTTP 请求并发送。以下是使用QNetworkAccessManager发送 POST 请求的示例代码,假设使用阿里云通用文字识别 API:

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    QString getBase64FromPixmap(const QPixmap& pixmap) {
    QByteArray byteArray;
    QBuffer buffer(&byteArray);
    pixmap.save(&buffer, "PNG");
    return byteArray.toBase64();
    }

    void sendOcrRequest(const QPixmap& pixmap, const QString& accessKeyId, const QString& accessKeySecret) {
    QNetworkAccessManager* manager = new QNetworkAccessManager(this);
    QUrl url("https://ocr.cn - hangzhou.aliyuncs.com/ocr/general");
    QUrlQuery query;
    query.addQueryItem("AccessKeyId", accessKeyId);
    query.addQueryItem("Format", "JSON");
    query.addQueryItem("Version", "2019 - 12 - 30");
    QString timestamp = QDateTime::currentDateTimeUtc().toString(Qt::ISODate);
    query.addQueryItem("Timestamp", timestamp);
    query.addQueryItem("SignatureMethod", "HMAC - SHA1");
    query.addQueryItem("SignatureVersion", "1.0");
    QString content = getBase64FromPixmap(pixmap);
    QJsonObject requestBody;
    requestBody["image"] = content;
    QJsonDocument doc(requestBody);
    QByteArray postData = doc.toJson(QJsonDocument::Compact);
    QString stringToSign = "POST&%2Focr%2Fgeneral&" + QUrl::toPercentEncoding(query.toString(QUrl::FullyEncoded));
    QByteArray hmac = QCryptographicHash::hash(QByteArray(accessKeySecret + "&").toUtf8(), QCryptographicHash::Sha1);
    QString signature = QUrl::toPercentEncoding(QByteArray(hmac.toBase64().trimmed()));
    query.addQueryItem("Signature", signature);
    url.setQuery(query);
    QNetworkRequest request(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    QNetworkReply* reply = manager->post(request, postData);
    connect(reply, &QNetworkReply::finished, reply {
    if (reply->error() == QNetworkReply::NoError) {
    QByteArray responseData = reply->readAll();
    QJsonDocument responseDoc = QJsonDocument::fromJson(responseData);
    QJsonObject responseObj = responseDoc.object();
    // 处理识别结果
    } else {
    qDebug() << "请求失败: " << reply->errorString();
    }
    reply->deleteLater();
    });
    }

  3. 解析识别结果并写入 Excel

    • 解析阿里云 API 返回的 JSON 数据,提取所需信息。然后使用libxlsxwriter库将信息写入 Excel 文件。

    #include "xlsxwriter.h"

    void writeToExcel(const QString& filePath, const QList& dataList) {
    lxw_workbook* workbook = workbook_new(filePath.toUtf8().constData());
    lxw_worksheet* worksheet = workbook_add_worksheet(workbook, NULL);
    for (int i = 0; i < dataList.size(); ++i) {
    worksheet_write_string(worksheet, i, 0, dataList[i].toUtf8().constData(), NULL);
    }
    workbook_close(workbook);
    }

  4. 批量处理

    • 遍历指定文件夹下的所有图片和 PDF 文件,依次进行处理。

    #include

    void batchProcess(const QString& folderPath, const QString& accessKeyId, const QString& accessKeySecret) {
    QDir dir(folderPath);
    foreach (QString file, dir.entryList(QDir::Files)) {
    if (file.endsWith(".pdf")) {
    QString pdfFilePath = folderPath + "/" + file;
    int pageCount = 0;
    Poppler::Document* doc = Poppler::Document::load(pdfFilePath);
    if (doc &&!doc->isLocked()) {
    pageCount = doc->numPages();
    delete doc;
    }
    for (int i = 0; i < pageCount; ++i) {
    QPixmap pixmap = pdfPageToPixmap(pdfFilePath, i);
    sendOcrRequest(pixmap, accessKeyId, accessKeySecret);
    }
    } else if (file.endsWith(".jpg") || file.endsWith(".png")) {
    QString imageFilePath = folderPath + "/" + file;
    QPixmap pixmap(imageFilePath);
    sendOcrRequest(pixmap, accessKeyId, accessKeySecret);
    }
    }
    }

在实际应用中,你需要将accessKeyIdaccessKeySecret替换为你自己的阿里云访问密钥,并根据实际需求进一步完善代码,例如处理更复杂的识别结果解析、优化 Excel 写入格式等。

相关推荐
weixin_493503673 小时前
Vue3 前端生成 PDF:会员证书与活动签到表的三种打印方案与踩坑记录
前端·pdf·状态模式
医疗信息化王工4 小时前
DataForge:基于 Python 的数据库批量导出 Excel 工具——从架构到部署的全流程实战
数据库·python·excel
、如果7 小时前
PDF图片文字提取零依赖方案:pymupdf+AI视觉实战
人工智能·数据分析·pdf·图片提取·文字提取·skills
SamChan9010 小时前
PDF翻译后的格式完整性校验:用Python自动比对译文与原文档的表格与段落结构
开发语言·python·ai·pdf·机器翻译
web打印社区10 小时前
浏览器静默打印?先别装第三个库了
前端·vue.js·chrome·electron·pdf
1314lay_100711 小时前
通过Sql Server创建EXCEL文件:master..xp_cmdshell
数据库·excel
Littlehero_12111 小时前
QT自定义控件之电气接线图(源码开源)
开发语言·qt
qq7621182211 小时前
Ubuntu22.04 Qt 调用shell 脚本启动程序,GLFW 初始化失败
qt
边境悍匪12 小时前
蜗牛学苑 Java 智能体学习 Day39|SpringAI 会话存储、Function‑Call 工具调用、MCP 思维导图复盘
java·开发语言·spring boot·学习·阿里云
蓝悦无人机13 小时前
Qt Design Studio(QDS)4.8.2项目文件结构详解
开发语言·qt·qt creator·qds·项目文件结构·qtc