Android运行pdf2image脚本提示poppler未在PATH中如何解决
问题根因
pdf2image 是上层Python封装库,底层完全依赖poppler工具链的pdfinfo、pdftocairo二进制程序完成PDF解析、渲染操作。Ubuntu环境已经预安装了poppler所以脚本可以正常运行,安卓系统没有内置该工具链,所以会触发找不到依赖的报错。
方案1:Chaquopy自研APP场景解决方案
步骤1:集成poppler安卓二进制文件
先获取对应安卓架构(arm64-v8a、armeabi-v7a等)的poppler预编译二进制文件,提取出pdfinfo、pdftocairo两个可执行文件,放入安卓项目的src/main/jniLibs/<对应架构>/目录,打包时会自动集成到APK中。
注意:部分安卓版本要求jniLibs下的文件必须以
lib开头、.so结尾,可将两个可执行文件重命名为libpdfinfo.so、libpdftocairo.so再放入。
步骤2:显式指定poppler路径
修改pdf2Img.py代码,在调用convert_from_bytes时显式传入poppler工具的路径:
from pdf2image import convert_from_bytes import sys import os import shutil import io import jpype def extractImagesFromPdf(fileContents): BASE_DIR = 'in_pdfs' EXTENSION = '.pdf' OUT_DIR = 'images' IMG_EXT = '.jpg' sep = "/" # 获取APP原生库目录,也就是poppler二进制的存放路径 context = jpype.JClass("com.chaquo.python.android.AndroidPlatform").getApplication() poppler_path = context.getApplicationInfo().nativeLibraryDir if not os.path.exists(getDirectoryPath(BASE_DIR)): os.mkdir(getDirectoryPath(BASE_DIR)) # 调用时传入poppler路径参数 pages = convert_from_bytes(fileContents, poppler_path=poppler_path) if os.path.exists(getDirectoryPath(OUT_DIR)): shutil.rmtree(getDirectoryPath(OUT_DIR)) os.mkdir(getDirectoryPath(OUT_DIR)) page_num = 1 for page in pages: page.save(getDirectoryPath(OUT_DIR) + sep + str(page_num) + IMG_EXT, 'JPEG') page_num = page_num + 1 def getDirectoryPath(dir): base_path = os.path.dirname(__file__) return base_path + "/" + dir
步骤3:修复调用大小写问题
Java层调用的函数名是extractImagesFromPDF,但Python侧定义的函数名是extractImagesFromPdf,大小写不一致会触发函数找不到的错误,将两边的函数名修改为一致即可。
方案2:第三方Python运行APP场景解决方案
如果你使用Termux这类支持完整Linux环境的安卓Python运行APP,直接执行命令安装poppler即可正常运行脚本:
pkg install poppler
如果是其他不支持自定义安装系统依赖的封闭Python运行APP,无法适配该需求,建议切换为自研APP使用方案1实现。
内容的提问来源于stack exchange,提问作者Aakankasha Sharma
相关产品推荐
相关产品推荐

