首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【PDF识别重命名】如何识别PDF区域内容对文件进行改名处理或将内容导出表格

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

原创
作者头像
不负众望
发布于 2025-02-24 09:44:59
发布于 2025-02-24 09:44:59
33700
代码可运行
举报
运行总次数: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
运行
AI代码解释
复制
#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
运行
AI代码解释
复制
g++ -o pdf_processing pdf_processing.cpp -lpoppler-cpp -lxl

运行生成的可执行文件:

sh

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

注意事项

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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
UNIX 高级环境编程 实验二 目录树的遍历
以课本132-134页程序4-22为参考,在此基础上进行修改和扩展,实现目录树的遍历,具体需要根据传入参数的不同实现以下功能:
glm233
2020/10/28
1.1K0
UNIX 高级环境编程 实验二  目录树的遍历
【Linux系统调用API】六、目录操作相关函数
首先,看测试结果中打印的内容,getcwd()函数获取到的路径确实是我们通过chdir()函数指定的路径,并且test路径从无到有增加了一个文件,也证明我们切换工作路径成功了。但是有些人可能会有一个疑惑,看途中的红色箭头标记,既然当前工作路径已经切换为①所标识的路径了,那么为什么②处显示的工作路径还是原来的路径呢?这是因为,我们在程序中使用chdir()函数切换的路径是进程 ./chdir_test 的路径,也就是说 ./chdir_test 的路径被切换为①了,并且测试结果(hello.txt文件的创建)也证明切换成功。而②所标识的路径是当前shell进程的工作路径,它们俩根本不是一回事。
mindtechnist
2024/08/08
2330
【Linux系统调用API】六、目录操作相关函数
Linux下目录编程(读取、创建、拷贝)
之前有几篇文章介绍了Linux下文件编程,那么目录和文件编程类似,也有一套函数,可以打开,读取、创建目录等。创建目录、文件除了命令以外(mkdir、touch),都有对应的函数实现相同功能。 使用较多的就是遍历目录的功能,比如: 音乐播放器需要循环播放指定目录下所有音频文件,视频播放器需要遍历指定目录查找所有的视频文件加入到播放列表等等。
DS小龙哥
2022/01/10
6K0
4(文件和目录)
unix 的文件类型(包含在st_mode中) 1> 普通文件,包含了某种类型的数据,可以是二进制的也可以是文本 2>目录文件,目录文件时包含了其他文件的文件名和链接的文件。 3>字符设备文件,对文件的读写以字符为单位的,没有缓冲区 4>块设备文件,对文件的读写以某个大小的块为单位,有缓冲区,写入与读出都是从缓冲区的读写 5>FIFO文件 也就是命名管道文件 6>符号连结:指向另一个文件的文件
提莫队长
2019/02/21
6740
Linux 日志文件管理——限制大小
  1 用一个INI配置文件管理日志目录,日志文件限制的大小,特殊的日志名,特殊日志的大小限制。
jianghaibobo
2019/08/02
12K0
C++ 分区、文件夹大小获取、文件数据操作demo示例
My Table 1. 获取分区大小和可用空间 2. 获取文件夹大小 3. 删除路径文件 4. 文件行读取即字符串内容比较 5. 传输百分比计算 6. char字符数组打印 7. 读取buffer字符串 8. bin二进制文件读取操作 Android C++模块有时候需要对文件系统进行操作,比如获取某个分区的大小、可用空间,获取某个路径文件夹的大小,文件内容读取及字符串比较、文件大小读取等demo代码示例 1. 获取分区大小和可用空间 //方式3:使用statfs (头文件#include <sys
wizzie
2022/09/28
1.9K0
Linux C++ 遍历文件夹
(本文仅适用于Linux C++) 这个方法用到了dirent.h,相关资料: C++ struct dirent 和 DIR 具体代码实现,遍历了给定目录下的所有文件夹和文件: #include<bits/stdc++.h> #ifdef linux #include<dirent.h> #endif using namespace std; struct walk_return { vector<string> files; vector<string>dirs; }; wal
灯珑LoGin
2022/10/31
7.4K0
linux系统编程之文件与I/O(三):目录的操作
该文章介绍了Linux系统编程之文件与I/O(三):目录的操作。主要包括打开目录、访问目录中的细节、关闭目录、目录信息结构体、创建删除和权限设置以及示例程序等内容。
s1mba
2018/01/03
9140
opendir/readdir/closedir 目录遍历相关函数
opendir是一个C库函数,可以通过man 3 opendir查看函数相关的详细内容。
lexingsen
2022/02/24
1.3K0
opendir/readdir/closedir 目录遍历相关函数
[apue] linux 文件系统那些事儿
说到 linux 的文件系统,好多人第一印象是 ext2/ext3/ext4 等具体的文件系统,本文不涉及这些,因为研究具体的文件系统难免会陷入细节,甚至拉大段的源码做分析,反而不能从宏观的角度把握文件系统要解决的问题。一个通用的 linux 文件系统都包含哪些概念?接口如何使用?设计层面需要考虑什么问题?这都在本文的讨论范围。当然了,内容都是从 apue 搬运过来的,经过了一点点梳理加工,原书还是基于比较老的 UFS (Unix File System) 进行说明的,有些东西可能已经过时了,不过原理层面的东西还是相通的,看过之后举一反三就好。
海海
2022/08/31
1.6K0
[apue] linux 文件系统那些事儿
Linux系统读取目录内文件顺序
在上一篇应用依赖不同的Netty版本引发的错误文章中, 在WEB-INF/lib目录下存在多个版本的Netty, 应用加载jar包的顺序颠倒, 导致应用启动报错. 而重点就在于加载jar包顺序.
书唐瑞
2022/06/02
3.8K0
Linux系统读取目录内文件顺序
Linux下的文件IO编程[通俗易懂]
以只写的方式打开1.txt。如果文件不存在就创建,如果文件存在就清空。
全栈程序员站长
2022/08/12
2.7K0
Linux下的文件IO编程[通俗易懂]
来用C语言模拟一下ls命令
在linux下使用C语言,通过调用Linux系统的目录访问API来实现一个类似于ls命令功能的小程序,主要是可以练习程序对命令的解析和目录API函数的使用。
fensnote
2021/05/31
1K0
linux中的read函数_linux open函数
int readdir_r( DIR *dirp, struct dirent *entry, struct dirent **result);
全栈程序员站长
2022/08/03
6.7K0
linux中的read函数_linux open函数
C++初级项目webserver项目流程介绍(2)
C++的webserver项目是自己在学完网络编程后根据网课的内容做的一个初级的网络编程项目。
莫浅子
2023/11/26
7260
C++初级项目webserver项目流程介绍(2)
嵌入式linux下的c语言日志log模块,功能增强(二)
打造一智能日志模块,让运维朝着自动化方向大步迈进。提高效率,降低成本,这也是一种创造利润的途径。
杨永贞
2020/08/04
4.5K0
Linux目录访问函数总结
Linux下目录访问函数总结,主要是涉及到的函数,以及所在头文件。 获得工作目录: #include <unistd.h> char *getcwd(char *buf,size_t size);char *getwd(char *buf);/*this is for FreeBSD*/ 改变当前目录: #include <unistd.h> int chdir(const char *path); 保存当前目录: #include
fensnote
2021/05/31
1.9K0
Linux编程--readdir
通常readdir都是与opendir配合使用. 通过opendir打开的目录, 使用readdir来进行遍历读取
None_Ling
2020/04/16
2.5K0
Linux系统下读取目录操作及可重入函数介绍
在写文章之前,分享一下今晚看伟东山老师的直播收获心得。我自身是一个小菜鸟,第一次听QEMU模拟器软件,不过听完老师的介绍感觉这功能好强大,感觉都不用买硬件了来做实验的(不过还是建议买开发板来做实验,比较有感觉,因为它还是不能模拟出特别先进的芯片,以及无法模拟出类似于GPU等复杂的硬件,而且搞底层软件开发的,还是要有开发板来支持的;当然,当你手头不是宽裕的时候,这个时候QEMU还是可以派上一定的作用了,至少可以测试一般的外设功能的,还是很强大的,我自己也在摸索使用),这里有兴趣的小伙伴可以看这个教程--------http://wiki.100ask.org/100ask_imx6ul_qemu。同时也非常期待伟老师后期录制的新教学视频。
用户6280468
2022/03/18
1.8K0
Linux系统下读取目录操作及可重入函数介绍
比ls快8倍?百万级文件遍历的奇技淫巧
1.问题背景 在Linux下当我们操作一个文件数较少的目录时,例如执行ls列出当前目录下所有的文件,这个命令可能会瞬间执行完毕,但是当一个目录下有上百万个文件时,执行ls命令会发生什么呢,带着疑问,我们做了如下实验(实验中使用的存储设备为NVMe接口的SSD): [root@localhost /data1/test_ls]# for i in {1..1000000}; do echo 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' > $i.txt ; done [ro
腾讯数据库技术
2018/06/05
5.3K3
推荐阅读
相关推荐
UNIX 高级环境编程 实验二 目录树的遍历
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验