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

