C++实现批量提取PDF内容

 更新时间:2025年02月10日 10:26:33   作者:平安喜乐-开开心心  
这篇文章主要为大家详细介绍了如何使用C++批量提取PDF里文字内容并导出到表格以及批量给 PDF 文件改名,感兴趣的小伙伴可以跟随小编一起学习一下

以下分别介绍基于 C++ 批量提取 PDF 里文字内容并导出到表格,以及批量给 PDF 文件改名的实现方案、步骤和应用场景。

批量提取 PDF 文字内容并导出到表格

应用场景

文档数据整理:在处理大量学术论文、报告等 PDF 文档时,需要提取其中的关键信息,如标题、作者、摘要等,并整理到表格中,方便后续的数据分析和比较。

信息归档:企业或机构可能有大量的合同、协议等 PDF 文档,需要将其中的重要条款、日期、金额等信息提取出来,存储到表格中进行统一管理和查询。

实现方案和步骤

1. 选择合适的库

Poppler:用于解析 PDF 文件并提取文字内容。Poppler 是一个开源的 PDF 渲染库,提供了 C++ 接口,可以方便地进行 PDF 文本提取。

LibXL:用于创建和操作 Excel 表格。它是一个跨平台的 C++ 库,支持创建、读取和修改 Excel 文件。

2. 安装依赖库

在 Linux 系统上,可以使用包管理器安装 Poppler 和 LibXL。例如,在 Ubuntu 上可以使用以下命令安装 Poppler:

sudo apt-get install libpoppler-cpp-dev

对于 LibXL,需要从其官方网站下载库文件,并将其包含到项目中。

3. 编写代码

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <poppler/cpp/poppler-document.h>
#include <poppler/cpp/poppler-page.h>
#include "libxl.h"
 
using namespace libxl;
 
// 提取 PDF 文件中的文字内容
std::string extractTextFromPDF(const std::string& filePath) {
    poppler::document* doc = poppler::document::load_from_file(filePath);
    if (!doc || doc->is_locked()) {
        delete doc;
        return "";
    }
 
    std::string text;
    for (int i = 0; i < doc->pages(); ++i) {
        poppler::page* page = doc->create_page(i);
        if (page) {
            text += page->text().to_latin1();
            delete page;
        }
    }
 
    delete doc;
    return text;
}
 
// 批量提取 PDF 文件内容并导出到 Excel 表格
void batchExtractPDFsToExcel(const std::vector<std::string>& pdfFiles, const std::string& outputFilePath) {
    Book* book = xlCreateBook();
    if (book) {
        Sheet* sheet = book->addSheet("PDF Text");
        if (sheet) {
            for (size_t i = 0; i < pdfFiles.size(); ++i) {
                std::string text = extractTextFromPDF(pdfFiles[i]);
                sheet->writeStr(i, 0, pdfFiles[i].c_str());
                sheet->writeStr(i, 1, text.c_str());
            }
        }
        book->save(outputFilePath.c_str());
        book->release();
    }
}
 
int main() {
    std::vector<std::string> pdfFiles = {
        "file1.pdf",
        "file2.pdf",
        // 添加更多 PDF 文件路径
    };
    std::string outputFilePath = "output.xlsx";
    batchExtractPDFsToExcel(pdfFiles, outputFilePath);
    return 0;
}

4. 编译和运行

使用以下命令编译代码:

g++ -o extract_pdf extract_pdf.cpp -lpoppler-cpp -lxl

运行生成的可执行文件:

./extract_pdf

批量给 PDF 文件改名

应用场景

文件整理:当从不同来源收集了大量 PDF 文件,文件名杂乱无章时,需要根据文件内容或特定规则对文件进行重命名,以便更好地管理和查找。

数据导入:在将 PDF 文件导入到某个系统或数据库时,要求文件名遵循一定的命名规范,此时需要对文件进行批量重命名。

实现方案和步骤

1. 选择合适的库

使用标准 C++ 库中的 <filesystem> (C++17 及以上)来处理文件和目录操作。

2. 编写代码

#include <iostream>
#include <filesystem>
#include <string>
 
namespace fs = std::filesystem;
 
// 批量给 PDF 文件改名
void batchRenamePDFs(const std::string& directoryPath) {
    int counter = 1;
    for (const auto& entry : fs::directory_iterator(directoryPath)) {
        if (entry.is_regular_file() && entry.path().extension() == ".pdf") {
            fs::path newPath = entry.path().parent_path() / (std::to_string(counter) + ".pdf");
            fs::rename(entry.path(), newPath);
            std::cout << "Renamed " << entry.path() << " to " << newPath << std::endl;
            ++counter;
        }
    }
}
 
int main() {
    std::string directoryPath = "./pdfs"; // 替换为实际的 PDF 文件目录
    batchRenamePDFs(directoryPath);
    return 0;
}

3. 编译和运行

使用以下命令编译代码:

g++ -std=c++17 -o rename_pdf rename_pdf.cpp

运行生成的可执行文件:

./rename_pdf

以上代码示例提供了基本的实现思路,你可以根据实际需求进行扩展和修改。

到此这篇关于C++实现批量提取PDF内容的文章就介绍到这了,更多相关C++提取PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt中树形控件Tree Widget的使用方法汇总

    Qt中树形控件Tree Widget的使用方法汇总

    最近小编在研究Tree Widget树形控件的相关知识,这种控件其实有时还是很有用处的,我主要利用的是带有复选框的树形控件,下面通过实例代码给大家介绍下Qt中树形控件Tree Widget的一些使用方法,感兴趣的朋友一起学习吧
    2021-11-11
  • C语言中获取进程识别码的相关函数

    C语言中获取进程识别码的相关函数

    这篇文章主要介绍了C语言中获取进程识别码的相关函数,分别为getpid()函数和getppid()函数的使用,需要的朋友可以参考下
    2015-08-08
  • C++类与对象深入之构造函数与析构函数详解

    C++类与对象深入之构造函数与析构函数详解

    朋友们好,这篇播客我们继续C++的初阶学习,现在对我们对C++非常重要的一个知识点做出总结,整理出来一篇博客供我们一起复习和学习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步
    2022-06-06
  • C++生成格式化的标准字符串实例代码

    C++生成格式化的标准字符串实例代码

    这篇文章主要给大家介绍了关于C++生成格式化的标准字符串的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • C++中vector<vector<int> >的基本使用方法

    C++中vector<vector<int> >的基本使用方法

    vector<vector<int> >其实就是容器嵌套容器,外层容器的元素类型是vector<int>,下面这篇文章主要给大家介绍了关于C++中vector<vector<int> >的基本使用方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • C语言中fgets和fscanf区别详解

    C语言中fgets和fscanf区别详解

    这篇文章主要介绍了C语言中fgets和fscanf区别详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • C/C++实现高并发http服务器的代码示例

    C/C++实现高并发http服务器的代码示例

    这篇文章简单给大家介绍了C/C++实现高并发http服务器的代码示例,文章通过代码和图文介绍的非常详细,感兴趣的同学可以参考阅读
    2023-07-07
  • C语言数据结构进阶之栈和队列的实现

    C语言数据结构进阶之栈和队列的实现

    栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解
    2021-11-11
  • C++循环队列实现模型

    C++循环队列实现模型

    这篇文章主要介绍了C++循环队列实现模型,较为详细的分析了循环队列算法的原理与实现方法,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • C语言判断回文数的小例子

    C语言判断回文数的小例子

    这篇文章主要介绍了C语言判断回文数的小例子,有需要的朋友可以参考一下
    2014-01-01

最新评论