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

【PDF提取内容】如何批量提取PDF里面的文字内容,把内容到处表格或者批量给PDF文件改名,基于C++的实现方案和步骤

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

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

应用场景
  • 文档数据整理:在处理大量学术论文、报告等 PDF 文档时,需要提取其中的关键信息,如标题、作者、摘要等,并整理到表格中,方便后续的数据分析和比较。
  • 信息归档:企业或机构可能有大量的合同、协议等 PDF 文档,需要将其中的重要条款、日期、金额等信息提取出来,存储到表格中进行统一管理和查询。
实现方案和步骤
1. 选择合适的库
  • Poppler:用于解析 PDF 文件并提取文字内容。Poppler 是一个开源的 PDF 渲染库,提供了 C++ 接口,可以方便地进行 PDF 文本提取。
  • LibXL:用于创建和操作 Excel 表格。它是一个跨平台的 C++ 库,支持创建、读取和修改 Excel 文件。
2. 安装依赖库

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

bash

sudo apt-get install libpoppler-cpp-dev

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

3. 编写代码

cpp

#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. 编译和运行

使用以下命令编译代码:

bash

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

运行生成的可执行文件:

bash

./extract_pdf

批量给 PDF 文件改名

应用场景
  • 文件整理:当从不同来源收集了大量 PDF 文件,文件名杂乱无章时,需要根据文件内容或特定规则对文件进行重命名,以便更好地管理和查找。
  • 数据导入:在将 PDF 文件导入到某个系统或数据库时,要求文件名遵循一定的命名规范,此时需要对文件进行批量重命名。
实现方案和步骤
1. 选择合适的库

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

2. 编写代码

cpp

#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. 编译和运行

使用以下命令编译代码:

bash

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

运行生成的可执行文件:

bash

./rename_pdf

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


http://www.kler.cn/a/539310.html

相关文章:

  • 音频进阶学习十一——离散傅里叶级数DFS
  • CSS 相关知识
  • 基于大模型的围术期脆弱性评估系统研究报告
  • 【SQL】count(1)、count() 与 count(列名) 的区别
  • AtCoder Beginner Contest 392(A-G)题解
  • 【算法】动态规划专题⑨ —— 二维费用背包问题 python
  • DeepSeek与Vue.js携手:打造高效分页组件之旅
  • 在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。
  • stm32编译过程剖析 MicroPython openmv运行逻辑分析 MicroPython和传统c语言编译的比较 头脑风暴
  • 本地部署DeepSeek-R1模型(新手保姆教程)
  • 树与二叉树的概念
  • Netty:高性能网络应用框架的深度解析
  • C++病毒
  • Chirpy3D:用于创意 3D 鸟类生成的连续部分潜在特征
  • Unity 基础编程
  • 334递增的三元子序列贪心算法(思路解析+源码)
  • feign Api接口中注解问题:not annotated with HTTP method type (ex. GET, POST)
  • 【系统设计】使用Spring Boot连接MySQL数据库
  • IT行业方向细分,如何做到专家水平——1.运维
  • MySQL时间类型相关总结(DATETIME, TIMESTAMP, DATE, TIME, YEAR)
  • CANoe工具使用技巧 --- 如何使用 “on ethernetPacket “事件处理程序
  • “深入浅出”系列之C++:(20)C++17
  • 四种垄断组织形式的简洁解释-AI
  • DevOps 与站点可靠性工程的比较
  • 小红书提出新面部视频交换方法DynamicFace,可生成高质量且一致的视频面部图像。
  • C++ -- 异常