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

Android环境下使用XDocReport转换ODT到PDF失败的问题求助及解决方法

Android环境下使用XDocReport转换ODT到PDF失败的问题求助及解决方法

问题背景

我最近在Android项目里尝试用XDocReport把ODT模板转成PDF,试了两种实现方式都报错,而且怀疑是Android环境下缺少默认依赖导致的——之前用Aspose可以正常实现但有水印,所以想换成XDocReport。我一开始只在Gradle里加了这一个依赖:

implementation 'fr.opensagres.xdocreport:fr.opensagres.xdocreport.document.odt:2.1.0'

第一种尝试代码及错误

代码实现:

Options options = Options.getFrom(DocumentKind.ODT).to(ConverterTypeTo.PDF);
InputStream raw = this.getResources().openRawResource(R.raw.timesheet_template);
IXDocReport xdocGenerator = XDocReportRegistry.getRegistry().loadReport(raw, TemplateEngineKind.Freemarker);
IContext context = xdocGenerator.createContext();
IConverter converter = ConverterRegistry.getRegistry().getConverter(options);
OutputStream out = new FileOutputStream(HOME_PATH+"/test.pdf");
xdocGenerator.convert(context, options, out);
raw.close();
out.close();

报错信息:

fr.opensagres.xdocreport.core.XDocReportException: Null template engine. Set template engine with IXDocReport#setTemplateEngine.

第二种尝试代码及错误

代码实现:

Options options = Options.getFrom(DocumentKind.ODT).to(ConverterTypeTo.PDF);
IConverter converter = ConverterRegistry.getRegistry().getConverter(options);
InputStream raw = this.getResources().openRawResource(R.raw.timesheet_template);
OutputStream out = new FileOutputStream(HOME_PATH+"/test.pdf");
converter.convert(raw, out, options);
raw.close();
out.close();

报错信息:

java.lang.NullPointerException: Attempt to invoke interface method 'void fr.opensagres.xdocreport.converter.IConverter.convert(java.io.InputStream, java.io.OutputStream, fr.opensagres.xdocreport.converter.Options)' on a null object reference

查了资料也看了错误提示,我觉得应该是Android环境下默认缺少某些XDocReport依赖,但不知道具体要加什么。


解决方法

后来我找到了对应的依赖配置和项目设置,终于解决了问题,步骤如下:

1. 配置完整Gradle依赖

在app模块的build.gradle里补充完整的依赖项:

implementation 'fr.opensagres.xdocreport:fr.opensagres.xdocreport.document.odt:2.1.0'
implementation 'fr.opensagres.xdocreport:fr.opensagres.xdocreport.template.freemarker:2.1.0'
implementation 'fr.opensagres.xdocreport:fr.opensagres.xdocreport.converter.odt.odfdom:2.1.0'
implementation 'ro.andob.androidawt:androidawt:1.0.4'

2. 处理依赖冲突

在build.gradle的android区块里添加配置,排除冲突的激活框架依赖:

android {
    // ... 保留原有其他配置
    configurations {
        all {
            // 排除冲突的依赖,二选一即可
            exclude group: "com.sun.activation", module: "jakarta.activation"
        }
    }
}

3. 添加自定义Maven仓库

在项目根目录的settings.gradle里,给pluginManagement和dependencyResolutionManagement的repositories都添加以下仓库地址:

maven { url "https://andob.io/repository/open_source" }

4. 配置ProGuard规则

在proguard-rules.pro里添加以下规则,避免混淆相关类导致报错:

-dontwarn org.bouncycastle.**
-dontwarn java.lang.invoke.**

5. 代码复用

之前尝试的两种代码实现,只要依赖和配置都到位,现在都可以正常运行了。


内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 07:48:05