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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 02:27:02