You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中iText PdfReader抛出IOException:文件/资源未找到求助

Android下iText PdfReader抛"文件未找到"异常但文件实际存在的解决方法

问题场景

使用iText库创建PdfReader实例时,始终抛出IOException提示"文件或资源未找到",但通过File.exists()验证文件确实存在,且同路径下的PdfWriter可正常工作。

相关代码:

String ficherosAuxiliaresDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/FG/FicherosInternos/Auxiliares/";
String src = ficherosAuxiliaresDir + "descuentosform.pdf";
String dest = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/FG/FicherosInternos/Descuentos/" + clienteSeleccionado.getIdCliente() + "-Hoja de descuentos-ForestalGarden.pdf";

myFilePdf = new File(dest);
PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest));

报错堆栈:

java.io.IOException: /storage/emulated/0/Download/FG/FicherosInternos/Auxiliares/descuentosform.pdf not found as file or resource.
    at com.itextpdf.io.source.RandomAccessSourceFactory.createByReadingToMemory(RandomAccessSourceFactory.java:245)
    at com.itextpdf.io.source.RandomAccessSourceFactory.createBestSource(RandomAccessSourceFactory.java:175)
    at com.itextpdf.kernel.pdf.PdfReader.<init>(PdfReader.java:157)
    ...

解决方案

方法1:改用File对象构造PdfReader

将字符串路径替换为File对象传入PdfReader,直接指定读取文件系统中的文件:

File srcFile = new File(src);
PdfReader reader = new PdfReader(srcFile);
PdfDocument pdfDoc = new PdfDocument(reader, new PdfWriter(dest));

方法2:使用FileInputStream构造PdfReader

通过文件流的方式读取文件,绕过iText的路径查找逻辑:

FileInputStream fis = new FileInputStream(new File(src));
try {
    PdfReader reader = new PdfReader(fis);
    PdfDocument pdfDoc = new PdfDocument(reader, new PdfWriter(dest));
    // 后续PDF处理逻辑
} finally {
    fis.close();
}

原因说明

iText的PdfReader(String)构造函数内部逻辑是:优先将传入的字符串视为classpath资源路径(比如jar包、assets目录内的资源),只有当资源查找失败时,才会尝试当作文件系统路径处理。在Android环境下,这种逻辑可能出现误判,导致明明是绝对文件路径,却未被正确识别为文件。而直接传入File或FileInputStream,会明确告诉iText读取文件系统中的文件,避免资源路径查找的干扰。

额外排查点

  • 权限验证:确认应用已申请读取外部存储的权限(Android 10及以下需READ_EXTERNAL_STORAGE,Android 10+访问公共Download目录无需额外权限,但自定义目录可能需要MANAGE_EXTERNAL_STORAGE)。
  • iText版本升级:部分旧版本iText在Android平台处理文件路径存在bug,建议升级到最新稳定版(如7.2.x系列)。
  • 路径合法性检查:打印并验证src路径的字符串是否完全正确,避免存在隐藏字符或编码问题。

内容的提问来源于stack exchange,提问作者PAR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:54:33