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
相关产品推荐
相关产品推荐

