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

从源码到应用:在openEuler/CentOS上编译poppler以赋能pdf2image高性能PDF图片抽取

1. 为什么需要从源码编译poppler在日常开发中我们经常需要处理PDF文档特别是将PDF转换为图片的需求。pdf2image作为Python中常用的PDF转图片工具其底层依赖poppler库来实现核心功能。但在实际使用中很多开发者会遇到性能瓶颈尤其是在国产化操作系统如openEuler或CentOS环境下。我最初也是直接使用系统自带的poppler库但在处理大量PDF文档时转换速度慢得让人难以接受。后来发现pdf2image虽然支持多线程参数thread_count但系统默认安装的poppler版本往往没有针对多线程场景进行优化。这就是为什么我们需要从源码编译定制poppler的原因。从源码编译可以带来三个明显优势性能优化能够针对特定CPU架构进行编译优化功能定制可以按需开启或关闭特定功能模块版本控制可以自由选择最适合的版本不受系统仓库限制2. 环境准备与依赖安装2.1 系统环境确认首先确认你的系统环境。我使用的是openEuler 22.03 LTS但下面的步骤在CentOS 7/8、RHEL等基于RPM的系统上同样适用。建议先更新系统sudo yum update -y2.2 基础依赖安装poppler编译需要大量基础开发工具和库文件。这些可以直接通过包管理器安装sudo yum install -y gcc-c cmake make autoconf automake libtool \ nss-devel fontconfig-devel freetype-devel libtiff-devel \ mesa-libGL-devel ninja-build systemd-devel pcre2 pcre2-devel \ glib2-devel harfbuzz-devel lcms2-devel libcurl-devel \ poppler-cpp-devel openssl-devel这里有个小技巧如果你不确定某个依赖是否已安装可以用rpm -q命令查询比如rpm -q freetype-devel。2.3 特殊依赖处理poppler有几个特殊依赖需要从源码编译安装主要是由于系统仓库中的版本可能不兼容libassuan安装wget https://www.gnupg.org/ftp/gcrypt/libassuan/libassuan-2.5.5.tar.bz2 tar xjf libassuan-2.5.5.tar.bz2 cd libassuan-2.5.5 ./configure --prefix/usr/local make -j$(nproc) sudo make installgpgme安装wget https://www.gnupg.org/ftp/gcrypt/gpgme/gpgme-1.19.0.tar.bz2 tar xjf gpgme-1.19.0.tar.bz2 cd gpgme-1.19.0 ./configure --prefix/usr/local make -j$(nproc) sudo make install安装完这些依赖后建议设置环境变量export PKG_CONFIG_PATH/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH export LD_LIBRARY_PATH/usr/local/lib64:$LD_LIBRARY_PATH3. Qt6的编译与问题解决3.1 Qt6源码编译poppler的可选Qt支持需要Qt6开发环境。直接从源码编译Qt6是个挑战但可以按以下步骤操作wget https://download.qt.io/archive/qt/6.2/6.2.4/single/qt-everywhere-src-6.2.4.tar.xz tar xf qt-everywhere-src-6.2.4.tar.xz cd qt-everywhere-src-6.2.4修改CMakeLists.txt在文件开头添加set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/lib;/usr/lib64;/usr/lib)然后配置和编译mkdir build cd build cmake .. -DPCRE2_INCLUDE_DIRS/usr/include -DPCRE2_LIBRARY/usr/lib64/libpcre2.so make -j$(nproc) sudo make install3.2 常见Qt6编译问题在实际操作中我遇到了几个典型问题宏命名错误Qt源码中有部分宏定义以数字开头这在某些严格模式下会报错。最简单的解决方法是修改对应的宏定义或者在configure时添加宽松的编译选项。磁盘空间不足完整编译Qt6需要约20GB空间。如果空间不足可以考虑只编译必要模块./configure -skip qtwebengine -skip qtwebsockets -skip qtwebchannel依赖缺失Qt会依赖很多系统库建议提前安装sudo yum install -y libxcb-devel xcb-util-devel xcb-util-image-devel \ xcb-util-keysyms-devel xcb-util-renderutil-devel xcb-util-wm-devel4. poppler的编译与优化4.1 获取poppler源码建议从官网获取稳定版本wget https://poppler.freedesktop.org/poppler-24.01.0.tar.xz tar xf poppler-24.01.0.tar.xz cd poppler-24.01.04.2 配置编译选项创建构建目录并配置mkdir build cd build cmake .. -DENABLE_QT5OFF -DENABLE_QT6ON \ -DENABLE_GLIBON -DENABLE_CPPON \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_INSTALL_PREFIX/usr/local关键参数说明-DENABLE_QT6ON启用Qt6支持如果已编译安装Qt6-DCMAKE_BUILD_TYPERelease启用优化编译-DCMAKE_INSTALL_PREFIX指定安装路径4.3 编译与安装make -j$(nproc) sudo make install编译完成后更新动态链接库缓存sudo ldconfig验证安装pdfinfo --version应该输出类似pdfinfo version 24.01.0的信息。5. 性能测试与优化建议5.1 基础性能测试使用pdf2image进行简单测试from pdf2image import convert_from_path import time start time.time() images convert_from_path(test.pdf, thread_count4) print(f转换耗时: {time.time()-start:.2f}秒)在我的测试环境中4核CPU8GB内存一个100页的PDF使用系统自带poppler约45秒使用优化编译的poppler约12秒5.2 关键优化参数在pdf2image中影响性能的关键参数thread_count设置与CPU核心数相同通常最佳dpi根据实际需要调整一般150-300足够output_folder指定输出目录避免内存占用过高5.3 高级优化技巧内存优化处理大PDF时可以分批处理for i in range(0, page_count, 10): images convert_from_path(large.pdf, first_pagei, last_pagei9)缓存利用重复处理相同PDF时可以考虑缓存已转换的页面。硬件加速如果支持CUDA可以尝试编译支持GPU加速的poppler版本。6. 常见问题解决方案6.1 动态库找不到问题如果运行时出现类似libpoppler.so.133: cannot open shared object file的错误需要确保动态库路径正确export LD_LIBRARY_PATH/usr/local/lib64:$LD_LIBRARY_PATH或者永久生效echo /usr/local/lib64 | sudo tee /etc/ld.so.conf.d/poppler.conf sudo ldconfig6.2 pdf2image报错处理常见错误及解决方法PDFInfoNotInstalledError确认poppler-utils已安装PDFSyntaxError可能是PDF文件损坏尝试用其他工具打开MemoryError减少thread_count或分批处理6.3 多线程不稳定问题如果多线程下出现崩溃可以尝试降低线程数重新编译poppler并添加调试信息cmake .. -DCMAKE_BUILD_TYPEDebug7. 实际应用案例在LangChain项目中我使用优化后的poppler处理大量PDF文档。典型的工作流程如下文档预处理def pdf_to_images(pdf_path, output_dir): images convert_from_path(pdf_path, dpi200, thread_count4) for i, img in enumerate(images): img.save(f{output_dir}/page_{i1}.png)与文本关联import pdfplumber with pdfplumber.open(pdf_path) as pdf: for i, page in enumerate(pdf.pages): text page.extract_text() # 将text与images[i]关联处理LangChain集成from langchain.document_loaders import DirectoryLoader loader DirectoryLoader(./processed_docs/, glob**/*.png) documents loader.load()这种组合方案在我的项目中将处理效率提升了3-5倍特别是对于需要同时处理图片和文本内容的场景。

相关文章:

从源码到应用:在openEuler/CentOS上编译poppler以赋能pdf2image高性能PDF图片抽取

1. 为什么需要从源码编译poppler? 在日常开发中,我们经常需要处理PDF文档,特别是将PDF转换为图片的需求。pdf2image作为Python中常用的PDF转图片工具,其底层依赖poppler库来实现核心功能。但在实际使用中,很多开发者会…...

从‘tlsv1 unrecognized name’报错聊起:老系统安全迁移的‘软着陆’方案(wget2实战)

从TLSv1 unrecognized name报错到老系统安全迁移:渐进式升级实战指南 当你在深夜收到生产环境告警,发现核心系统的自动化下载任务突然失败,屏幕上赫然显示着tlsv1 unrecognized name的报错时,这远不止是一个简单的命令修复问题。这…...

python 项目自动生成requirements.txt文件

python 项目自动生成requirements.txt文件本文介绍了如何在Python项目中使用pip freeze和pipreqs工具生成requirements.txt文件,包括基本操作步骤和两种方法的对比,适用于开发者管理项目依赖。requirements.txt文件格式:一键获取完整项目代码…...

免费跨平台终极文本对比工具:Diff Checker完整使用指南

免费跨平台终极文本对比工具:Diff Checker完整使用指南 【免费下载链接】diff-checker Desktop application to compare text differences between two files (Windows, Mac, Linux) 项目地址: https://gitcode.com/gh_mirrors/di/diff-checker 还在为代码修…...

告别GPS信号弱:手把手教你用Android陀螺仪和加速度计做惯性导航避障小车

告别GPS信号弱:手把手教你用Android陀螺仪和加速度计做惯性导航避障小车 在室内、隧道或高楼林立的城市峡谷中,GPS信号常常变得不可靠甚至完全消失。这时,惯性导航系统(INS)就能大显身手。本文将带你一步步实现一个基于…...

从数据帧到精准定位:深度解析sensor_msgs/NavSatFix消息的实战应用

1. 从数据帧到精准定位:NavSatFix消息的实战意义 当你第一次看到sensor_msgs/NavSatFix消息时,可能会觉得这不过是一堆数字和字段的组合。但在我处理过的自动驾驶项目中,这个看似简单的数据结构往往是整个定位系统的命脉。想象一下&#xff0…...

7个技巧掌握extract-video-ppt:从视频中智能提取可编辑PPT的完整指南

7个技巧掌握extract-video-ppt:从视频中智能提取可编辑PPT的完整指南 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 在数字化时代,视频内容已成为知识传播的…...

别再死记硬背了!用FreeSWITCH实战理解PSTN与VoIP核心概念(信令/媒体/交换)

从FreeSWITCH实战出发:用配置与日志理解PSTN与VoIP核心架构 在通信技术领域,PSTN与VoIP的理论概念常常让初学者感到抽象难懂。那些关于信令、媒体流、交换方式的教科书定义,往往需要反复背诵却依然难以形成直观认知。而FreeSWITCH作为一款开源…...

下一代数据平台:智能体、分布式与协作性三大基因解析

1. 项目概述:下一代数据平台的三大基因去年在调试一个跨区域数据管道时,我不得不手动协调五个不同团队的API版本。当第七次因为字段映射不一致导致ETL失败时,我突然意识到:传统数据平台就像是用传真机处理现代通信需求。这正是Da2…...

2025最权威的降重复率工具推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 将文稿相似度降低的网站,是给撰写论文之人提供查重后文本改写服务的学术辅助工具…...

免费在线游戏手柄检测工具:3分钟快速诊断手柄按键故障

免费在线游戏手柄检测工具:3分钟快速诊断手柄按键故障 【免费下载链接】gamepadtest Gamepad API Test 项目地址: https://gitcode.com/gh_mirrors/ga/gamepadtest 还在为游戏手柄按键失灵而烦恼吗?这款免费的在线游戏手柄测试工具能帮你快速诊断…...

别再手动算坐标了!用ROS tf2搞定机器人坐标系转换(附C++/Python代码对比)

别再手动算坐标了!用ROS tf2搞定机器人坐标系转换(附C/Python代码对比) 在机器人开发中,坐标系转换就像空气一样无处不在却又容易被忽视。想象一下,当激光雷达检测到前方1米处有个障碍物,这个"1米&quo…...

2026 年外贸私域CRM系统最新实测榜单:数据主权与全链路增长选型指南

摘要:随着外贸行业数字化转型进入深水区,私域 CRM已成为企业掌控数据主权、实现全链路增长的核心引擎。然而,市面上的外贸CRM系统良莠不齐,很多外贸企业陷入了“建了私域却无法转化”、“客户数据被平台裹挟”的窘境。本文从数据主…...

3大核心优势解析:为什么DeepMosaics是智能马赛克处理的最佳选择?

3大核心优势解析:为什么DeepMosaics是智能马赛克处理的最佳选择? 【免费下载链接】DeepMosaics Automatically remove the mosaics in images and videos, or add mosaics to them. 项目地址: https://gitcode.com/gh_mirrors/de/DeepMosaics 在数…...

金仓老旧项目改造-16-[vibe编程vlog]

今天工作app不支持kingbase金仓的修改并不麻烦,现在看只是要改一下Druid的配置类DruidConfig就可以了,增加以下修改即可// KingBase8 基于 PostgreSQL,Druid WallFilter 不识别 kingbase8 类型,需单独配置if (filters ! null &…...

AI训练卡到爆?试试用CXL把GPU和CPU内存打通,实测性能提升报告

AI训练显存不足?CXL技术如何打通GPU与CPU内存屏障 当你在深夜盯着屏幕,看着那个因为"CUDA out of memory"而崩溃的PyTorch训练脚本时,是否想过——为什么GPU显存和主机内存就像两个被隔离的孤岛?CXL(Compute…...

番茄小说永久保存终极指南:fanqienovel-downloader完整解决方案

番茄小说永久保存终极指南:fanqienovel-downloader完整解决方案 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 你是否曾经遇到过心爱的小说突然下架,再也找不到阅读…...

知识竞赛奖品清单推荐:实用激励方案与软件工具选择指南

🎁 知识竞赛奖品清单推荐激发学习热情 点亮智慧之光📌 引言:奖品在知识竞赛中的核心价值一场成功的知识竞赛,不仅在于题目设计的巧妙与赛制的公平,更在于能否通过恰当的激励手段,最大化地激发参赛者的潜能…...

6G时代AI驱动的无线接入网创新与NVIDIA技术实践

1. 6G时代AI驱动的无线接入网创新全景当全球5G部署进入第五个年头,通信产业的目光已投向2030年商用的6G系统。与历代移动通信技术不同,6G将首次实现AI技术与无线接入网(RAN)的深度融合。作为这一变革的核心推动者,NVIDIA通过三大技术支柱构建…...

别只当普通鼠标用!快鼠P30的语音听写功能,在写代码、写文档时到底香不香?

快鼠P30语音听写实测:程序员与技术写作者的高效利器 第一次听说鼠标还能语音输入时,我的反应和大多数人一样——这玩意儿真能有用?直到上个月连续加班赶项目文档,手腕酸痛到贴满膏药时,才抱着试试看的心态入手了快鼠P3…...

sklearn的precision_score报UndefinedMetricWarning?别慌,这其实是模型在‘交白卷’

当sklearn的precision_score发出UndefinedMetricWarning时,你的模型在说什么? 在机器学习项目的最后冲刺阶段,你终于跑通了整个训练流程,却在评估时遇到了那个令人不安的警告:"UndefinedMetricWarning: Precision…...

Qt桌面应用界面进阶:我把Ribbon菜单和AdvancedDocking拖拽停靠‘焊’在了一起

Qt桌面应用界面进阶:Ribbon菜单与AdvancedDocking无缝整合实战 在开发复杂桌面应用时,如何平衡功能密度与界面灵活性一直是UI设计的核心挑战。想象一下,你正在构建一款专业级CAD软件——用户既需要快速访问数百个工具命令,又要求自…...

我用 Codex Rule 模式“驯服AI写代码”:从翻车到稳定上线的完整实践(附企业级规则模板 + 架构图)

🚀《我用 Codex Rule 模式“驯服AI写代码”:从翻车到稳定上线的完整实践(附企业级规则模板 架构图)》 ❗很多人用 AI 写代码,最后都遇到一个问题: 👉 AI 写得越来越多,但你对项目的…...

抖音视频下载终极指南:免费批量处理工具完整教程

抖音视频下载终极指南:免费批量处理工具完整教程 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖…...

从SD卡制作到NFS挂载:手把手教你为ZYNQ7020 Petalinux系统配置完整网络调试环境

ZYNQ7020 Petalinux网络调试全流程实战:从SD卡制作到NFS挂载 当工程师完成Petalinux系统编译后,真正的挑战才刚刚开始——如何将系统部署到硬件并建立高效的网络调试环境?本文将带你跨越从理论到实践的鸿沟,通过七个关键步骤构建完…...

Phi-3-mini-4k-instruct-gguf效果实测:在中文逻辑题(如公务员行测)上的推理正确率展示

Phi-3-mini-4k-instruct-gguf效果实测:在中文逻辑题(如公务员行测)上的推理正确率展示 1. 模型简介与测试背景 Phi-3-Mini-4K-Instruct是一个仅有38亿参数的轻量级开源模型,属于微软Phi-3系列中的小型版本。这个模型特别之处在于…...

多模态数据库设计:应对异构数据存储与查询的挑战

1. 多模态数据为何需要专用数据库?十年前我们处理的数据90%是结构化数字,今天这个比例已经彻底颠倒。我最近接手的一个智能医疗项目,CT影像、病理切片、基因序列、临床记录等异构数据每天新增20TB,传统关系型数据库在首次压力测试…...

打破生态壁垒:3步让Windows电脑变身AirPlay 2接收器

打破生态壁垒:3步让Windows电脑变身AirPlay 2接收器 【免费下载链接】airplay2-win Airplay2 for windows 项目地址: https://gitcode.com/gh_mirrors/ai/airplay2-win 你是否曾经羡慕苹果设备之间的无缝投屏体验?是否因为Windows电脑无法接收iPh…...

PCEP-30-02考试避坑指南:那些官方教程里没明说,但一考就错的Python基础题

PCEP-30-02考试避坑指南:那些官方教程没明说但一考就错的Python细节 当你准备参加PCEP-30-02认证考试时,可能会觉得已经掌握了所有Python基础知识——直到在考场上遇到那些设计精巧的"陷阱题"。这些题目往往针对语言特性中的微妙细节&#xff…...

Resemble Enhance:AI语音增强技术如何重塑音频质量新标准

Resemble Enhance:AI语音增强技术如何重塑音频质量新标准 【免费下载链接】resemble-enhance AI powered speech denoising and enhancement 项目地址: https://gitcode.com/gh_mirrors/re/resemble-enhance 在数字音频处理领域,噪声干扰和音质退…...