前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【PDF识别重命名】如何识别PDF区域内容对文件进行改名处理或将内容导出表格

【PDF识别重命名】如何识别PDF区域内容对文件进行改名处理或将内容导出表格

原创
作者头像
不负众望
发布2025-02-24 17:44:59
发布2025-02-24 17:44:59
7400
代码可运行
举报
运行总次数:0
代码可运行

大型物流公司每天都会收到大量来自不同供应商的货物运单 PDF 文件。这些运单包含了货物的详细信息,如发货人、收货人、货物名称、运输单号等。为了方便管理和后续的数据统计分析,物流公司需要对这些 PDF 运单进行处理,具体需求如下:

1、从每个 PDF 运单中提取运输单号作为文件名,对文件进行重命名,以便于快速定位和查找特定运单。2、将所有运单中的关键信息(如发货人、收货人、货物名称、运输单号)导出到一个 Excel 表格中,方便进行数据统计和分析。

要实现识别 PDF 区域内容并对文件进行改名处理,或者将内容导出到表格,可借助第三方库来完成。这里以Poppler库进行 PDF 内容提取,LibXL库进行表格数据导出为例,下面是详细的解决方案。

环境准备

  • Poppler:用于解析和提取 PDF 文件内容。可以从其官方 GitHub 仓库获取源码并编译安装,也可以使用包管理器进行安装(如在 Ubuntu 上使用sudo apt-get install libpoppler-cpp-dev)。
  • LibXL:用于创建和操作 Excel 文件。可以从官方网站下载相应的库文件。

实现步骤

1. 识别 PDF 区域内容

使用Poppler库打开 PDF 文件,提取指定区域的文本内容。

2. 文件改名处理

根据提取的内容对 PDF 文件进行重命名。

3. 内容导出表格

使用LibXL库将提取的内容导出到 Excel 表格。

代码示例

cpp

代码语言:javascript
代码运行次数:0
复制
#include <iostream>
#include <string>
#include <poppler/cpp/poppler-document.h>
#include <poppler/cpp/poppler-page.h>
#include "libxl.h"

// 提取PDF指定区域的文本内容
std::string extractTextFromPDF(const std::string& filePath, double x, double y, double width, double height) {
    poppler::document* doc = poppler::document::load_from_file(filePath);
    if (!doc || doc->is_locked()) {
        delete doc;
        return "";
    }

    poppler::page* page = doc->create_page(0);
    if (!page) {
        delete doc;
        return "";
    }

    poppler::rectf rect(x, y, x + width, y + height);
    poppler::text_box_layout layout;
    layout.set_rect(rect);
    std::string text = page->text(layout).to_latin1();

    delete page;
    delete doc;
    return text;
}

// 对文件进行重命名
bool renameFile(const std::string& oldPath, const std::string& newName) {
    std::string newPath = oldPath.substr(0, oldPath.find_last_of("/\\") + 1) + newName + ".pdf";
    return std::rename(oldPath.c_str(), newPath.c_str()) == 0;
}

// 将内容导出到Excel表格
bool exportToExcel(const std::string& filePath, const std::string& content) {
    libxl::Book* book = xlCreateBook();
    if (book) {
        libxl::Sheet* sheet = book->addSheet("Sheet1");
        if (sheet) {
            sheet->writeStr(0, 0, content.c_str());
            if (book->save(filePath.c_str())) {
                book->release();
                return true;
            }
        }
        book->release();
    }
    return false;
}

int main() {
    std::string pdfFilePath = "example.pdf";
    // 假设提取区域的坐标和尺寸
    double x = 100, y = 100, width = 200, height = 50;

    // 提取指定区域的文本内容
    std::string extractedText = extractTextFromPDF(pdfFilePath, x, y, width, height);
    if (!extractedText.empty()) {
        std::cout << "Extracted text: " << extractedText << std::endl;

        // 对文件进行重命名
        if (renameFile(pdfFilePath, extractedText)) {
            std::cout << "File renamed successfully." << std::endl;
        } else {
            std::cerr << "Failed to rename file." << std::endl;
        }

        // 将内容导出到Excel表格
        std::string excelFilePath = "output.xlsx";
        if (exportToExcel(excelFilePath, extractedText)) {
            std::cout << "Content exported to Excel successfully." << std::endl;
        } else {
            std::cerr << "Failed to export content to Excel." << std::endl;
        }
    } else {
        std::cerr << "Failed to extract text from PDF." << std::endl;
    }

    return 0;
}

代码解释

  1. extractTextFromPDF:使用Poppler库打开 PDF 文件,提取指定区域的文本内容。
  2. renameFile:根据提取的内容对 PDF 文件进行重命名。
  3. exportToExcel:使用LibXL库将提取的内容导出到 Excel 表格。
  4. main:调用上述函数,完成 PDF 内容提取、文件重命名和内容导出到 Excel 的操作。

编译和运行

编译时需要链接PopplerLibXL库,示例命令如下:

sh

代码语言:javascript
代码运行次数:0
复制
g++ -o pdf_processing pdf_processing.cpp -lpoppler-cpp -lxl

运行生成的可执行文件:

sh

代码语言:javascript
代码运行次数:0
复制
./pdf_processing

注意事项

  • 确保PopplerLibXL库已正确安装,并且编译器能够找到相应的头文件和库文件。
  • 示例代码中假设 PDF 文件的第一页包含需要提取的内容,并且提取区域的坐标和尺寸是固定的,实际使用时需要根据具体情况进行调整。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境准备
  • 实现步骤
    • 1. 识别 PDF 区域内容
    • 2. 文件改名处理
    • 3. 内容导出表格
  • 代码示例
  • 代码解释
  • 编译和运行
  • 注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档