当前位置: 首页 > news >正文

图片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 <QPixmap>
#include <QFile>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;
}
  1. 调用阿里云 API 进行文字识别
    • 首先,需要构建 HTTP 请求并发送。以下是使用QNetworkAccessManager发送 POST 请求的示例代码,假设使用阿里云通用文字识别 API:
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrlQuery>
#include <QJsonObject>
#include <QJsonDocument>
#include <QFile>
#include <QBuffer>
#include <QCryptographicHash>
#include <QDateTime>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();});
}
  1. 解析识别结果并写入 Excel
    • 解析阿里云 API 返回的 JSON 数据,提取所需信息。然后使用libxlsxwriter库将信息写入 Excel 文件。
#include "xlsxwriter.h"void writeToExcel(const QString& filePath, const QList<QString>& 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);
}

  1. 批量处理
    • 遍历指定文件夹下的所有图片和 PDF 文件,依次进行处理。
#include <QDir>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 写入格式等。

http://www.lryc.cn/news/532325.html

相关文章:

  • Java 大视界 -- Java 大数据在智能教育中的应用与个性化学习(75)
  • 从零手写Spring IoC容器(二):bean的定义与注册
  • 《大模型面试宝典》(2025版) 发布了
  • AWS门店人流量数据分析项目的设计与实现
  • 出租车特殊计费表算法解析与实现
  • 文档解析技术:如何高效提取PDF扫描件中的文字与表格信息?
  • 【2】高并发导出场景下,服务器性能瓶颈优化方案-异步导出
  • 【DeepSeek论文精读】6. DeepSeek R1:通过强化学习激发大语言模型的推理能力
  • frida 通过 loadLibrary0 跟踪 System.loadLibrary
  • 【2025最新计算机毕业设计】基于SSM的智能停车场管理系统【提供源码+答辩PPT+文档+项目部署】(高质量源码,可定制,提供文档,免费部署到本地)
  • 【含文档+PPT+源码】Python爬虫人口老龄化大数据分析平台的设计与实现
  • 文本生图的提示词prompt和参数如何设置(基于Animagine XL V3.1)
  • 快速提取Excel工作簿中所有工作表的名称?
  • 【紫光同创PG2L100H开发板】盘古676系列,盘古100Pro+开发板,MES2L676-100HP
  • Node.JS 版本管理工具 Fnm 安装及配置(Windows)
  • labview通过时间计数器来设定采集频率
  • 汇编JCC条件跳转指令记忆
  • HTML排版标签、语义化标签、块级和行内元素详解
  • 【回溯+剪枝】单词搜索,你能用递归解决吗?
  • 《深度揭秘LDA:开启人工智能降维与分类优化的大门》
  • Linux(CentOS)安装 MySQL
  • C++ 使用CURL开源库实现Http/Https的get/post请求进行字串和文件传输
  • 面试题-SpringCloud的启动流程
  • MySQL基础知识
  • nas-群晖docker查询注册表失败解决办法(平替:使用SSH命令拉取ddns-go)
  • GSMA SGP.31 eSIM IoT 架构与需求笔记
  • sql版本序列号
  • vue2-nextTick
  • 【其他专题】如何在线将PNG转ICO图标
  • 2019_AutoInt