Android Studio生成PDF报No such file or directory错误如何解决
安卓PDF生成功能报错修复方案
现有问题定位
- 文件名拼写不一致:生成PDF时命名为
test_pdf.pdf,调用打印功能时传入的是text_pdf.pdf,直接触发文件不存在报错 - 流关闭未判空:
PdfDocumentAdaper的onWrite方法finally块直接调用流的close()方法,若流初始化失败会触发空指针异常 - 目录创建方法错误:
getAppPath中使用mkdir()创建目录,无法生成多级嵌套目录,会导致路径创建失败 - 自定义字体加载路径错误:直接通过
res/font/bellerose.ttf路径加载字体无法识别,iText找不到字体文件会抛出IO异常 - 调试错误原因:
this不可用、File.separator无执行代码一般是debug时Fragment未完全attach到Activity,或者debug版本开启了代码混淆导致调试信息丢失
具体修复步骤
1. 统一文件名拼写
修改printPDF方法中的PDF文件名,和生成时保持一致:
private void printPDF() { PrintManager printManager = (PrintManager) getActivity().getSystemService(Context.PRINT_SERVICE); try { // 将text_pdf.pdf修改为test_pdf.pdf PrintDocumentAdapter printDocumentAdapter = new PdfDocumentAdaper(getActivity(), Common.getAppPath(getActivity()) + "test_pdf.pdf"); printManager.print("Document", printDocumentAdapter, new PrintAttributes.Builder().build()); } catch (Exception ex) { Log.e("Laura", ex.getMessage()); } }
2. 流关闭前增加非空判断
修改PdfDocumentAdaper的onWrite方法finally块逻辑:
finally { try { if (in != null) in.close(); if (out != null) out.close(); } catch (IOException ex) { Log.e("Laura", ex.getMessage()); } }
3. 替换目录创建方法
修改Common.getAppPath中的目录生成逻辑,支持多级目录创建:
public static String getAppPath(Context context){ File dir = new File(context.getFilesDir().getAbsolutePath() + File.separator + context.getResources().getString(R.string.app_name) + File.separator ); if(!dir.exists()) // 替换mkdir()为mkdirs() dir.mkdirs(); return dir.getPath()+File.separator; }
4. 修复自定义字体加载逻辑
将bellerose.ttf字体文件放到项目src/main/assets/font/目录下(没有assets目录可手动新建),再修改字体加载代码:
// 替换原BaseFont.createFont逻辑 BaseFont fontName = BaseFont.createFont("font/bellerose.ttf", "UTF-8", BaseFont.EMBEDDED);
5. 修复调试报错
- 检查代码逻辑,确保Fragment完全attach到Activity后再调用
Common.getAppPath方法 - 关闭debug版本的代码混淆,修改app模块
build.gradle配置:
buildTypes { debug { minifyEnabled false debuggable true } }
- 冗余权限可移除:当前用应用内部存储生成PDF,不需要申请
WRITE_EXTERNAL_STORAGE权限,可直接删除Dexter权限申请逻辑,减少context空风险
内容的提问来源于stack exchange,提问作者Antonia
相关产品推荐
相关产品推荐

