C++實(shí)現(xiàn)批量提取PDF內(nèi)容
以下分別介紹基于 C++ 批量提取 PDF 里文字內(nèi)容并導(dǎo)出到表格,以及批量給 PDF 文件改名的實(shí)現(xiàn)方案、步驟和應(yīng)用場景。
批量提取 PDF 文字內(nèi)容并導(dǎo)出到表格
應(yīng)用場景
文檔數(shù)據(jù)整理:在處理大量學(xué)術(shù)論文、報(bào)告等 PDF 文檔時,需要提取其中的關(guān)鍵信息,如標(biāo)題、作者、摘要等,并整理到表格中,方便后續(xù)的數(shù)據(jù)分析和比較。
信息歸檔:企業(yè)或機(jī)構(gòu)可能有大量的合同、協(xié)議等 PDF 文檔,需要將其中的重要條款、日期、金額等信息提取出來,存儲到表格中進(jìn)行統(tǒng)一管理和查詢。
實(shí)現(xiàn)方案和步驟
1. 選擇合適的庫
Poppler:用于解析 PDF 文件并提取文字內(nèi)容。Poppler 是一個開源的 PDF 渲染庫,提供了 C++ 接口,可以方便地進(jìn)行 PDF 文本提取。
LibXL:用于創(chuàng)建和操作 Excel 表格。它是一個跨平臺的 C++ 庫,支持創(chuàng)建、讀取和修改 Excel 文件。
2. 安裝依賴庫
在 Linux 系統(tǒng)上,可以使用包管理器安裝 Poppler 和 LibXL。例如,在 Ubuntu 上可以使用以下命令安裝 Poppler:
sudo apt-get install libpoppler-cpp-dev
對于 LibXL,需要從其官方網(wǎng)站下載庫文件,并將其包含到項(xiàng)目中。
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 文件中的文字內(nèi)容 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 文件內(nèi)容并導(dǎo)出到 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. 編譯和運(yùn)行
使用以下命令編譯代碼:
g++ -o extract_pdf extract_pdf.cpp -lpoppler-cpp -lxl
運(yùn)行生成的可執(zhí)行文件:
./extract_pdf
批量給 PDF 文件改名
應(yīng)用場景
文件整理:當(dāng)從不同來源收集了大量 PDF 文件,文件名雜亂無章時,需要根據(jù)文件內(nèi)容或特定規(guī)則對文件進(jìn)行重命名,以便更好地管理和查找。
數(shù)據(jù)導(dǎo)入:在將 PDF 文件導(dǎo)入到某個系統(tǒng)或數(shù)據(jù)庫時,要求文件名遵循一定的命名規(guī)范,此時需要對文件進(jìn)行批量重命名。
實(shí)現(xiàn)方案和步驟
1. 選擇合適的庫
使用標(biāo)準(zhǔn) 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"; // 替換為實(shí)際的 PDF 文件目錄 batchRenamePDFs(directoryPath); return 0; }
3. 編譯和運(yùn)行
使用以下命令編譯代碼:
g++ -std=c++17 -o rename_pdf rename_pdf.cpp
運(yùn)行生成的可執(zhí)行文件:
./rename_pdf
以上代碼示例提供了基本的實(shí)現(xiàn)思路,你可以根據(jù)實(shí)際需求進(jìn)行擴(kuò)展和修改。
到此這篇關(guān)于C++實(shí)現(xiàn)批量提取PDF內(nèi)容的文章就介紹到這了,更多相關(guān)C++提取PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中獲取進(jìn)程識別碼的相關(guān)函數(shù)
這篇文章主要介紹了C語言中獲取進(jìn)程識別碼的相關(guān)函數(shù),分別為getpid()函數(shù)和getppid()函數(shù)的使用,需要的朋友可以參考下2015-08-08C++類與對象深入之構(gòu)造函數(shù)與析構(gòu)函數(shù)詳解
朋友們好,這篇播客我們繼續(xù)C++的初階學(xué)習(xí),現(xiàn)在對我們對C++非常重要的一個知識點(diǎn)做出總結(jié),整理出來一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們在評論區(qū)指出,我們相互學(xué)習(xí),共同進(jìn)步2022-06-06C++生成格式化的標(biāo)準(zhǔn)字符串實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于C++生成格式化的標(biāo)準(zhǔn)字符串的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09C++中vector<vector<int>?>的基本使用方法
vector<vector<int>?>其實(shí)就是容器嵌套容器,外層容器的元素類型是vector<int>,下面這篇文章主要給大家介紹了關(guān)于C++中vector<vector<int>?>的基本使用方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07C/C++實(shí)現(xiàn)高并發(fā)http服務(wù)器的代碼示例
這篇文章簡單給大家介紹了C/C++實(shí)現(xiàn)高并發(fā)http服務(wù)器的代碼示例,文章通過代碼和圖文介紹的非常詳細(xì),感興趣的同學(xué)可以參考閱讀2023-07-07C語言數(shù)據(jù)結(jié)構(gòu)進(jìn)階之棧和隊(duì)列的實(shí)現(xiàn)
棧和隊(duì)列,嚴(yán)格意義上來說,也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯壿嬯P(guān)系為 "一對一" 的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解2021-11-11C++循環(huán)隊(duì)列實(shí)現(xiàn)模型
這篇文章主要介紹了C++循環(huán)隊(duì)列實(shí)現(xiàn)模型,較為詳細(xì)的分析了循環(huán)隊(duì)列算法的原理與實(shí)現(xiàn)方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12