办公文档处理:在企业日常办公中,经常会遇到大量的扫描文档(如发票、合同、报表等)以图片或 PDF 格式存储。需要将这些文档中的特定区域信息(如发票金额、合同条款、报表数据等)提取出来,整理到 Excel 表格中,以便进行数据分析、统计和进一步处理。
数据采集与整理:对于从事数据采集工作的人员,从各种图片和 PDF 资料中提取特定区域的信息,并汇总到 Excel,能够快速整合数据,为后续的数据挖掘和分析提供基础。
![](https://i-blog.csdnimg.cn/direct/65455e39e60d40d193da8a5910a5dcdd.jpeg)
详细代码步骤
-
创建 QT 项目并配置环境
- 打开 QT Creator,创建一个新的 Qt Widgets Application 项目。
- 在项目的
.pro
文件中添加以下内容:
QT += network
LIBS += -L/path/to/libxlsxwriter -lxlsxwriter
- 请将
/path/to/libxlsxwriter
替换为实际的libxlsxwriter
库路径。
-
读取图片和 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;
} - 对于图片,使用
-
调用阿里云 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();
});
} - 首先,需要构建 HTTP 请求并发送。以下是使用
-
解析识别结果并写入 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);
} - 解析阿里云 API 返回的 JSON 数据,提取所需信息。然后使用
-
批量处理
- 遍历指定文件夹下的所有图片和 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);
}
}
}
在实际应用中,你需要将accessKeyId
和accessKeySecret
替换为你自己的阿里云访问密钥,并根据实际需求进一步完善代码,例如处理更复杂的识别结果解析、优化 Excel 写入格式等。