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

使用Java/Kotlin实现XPS文件转文本的方法及示例

用Java/Kotlin实现XPS文件转文本的方案

我希望使用Java或者Kotlin将.XPS文件转换为文本。

Aspose的定价对我来说过高,无法承担。我找到了Java-AXP库理论上可以实现该需求,但找不到对应的官方文档或示例代码。我已经把Java-AXP Core引入到IntelliJ项目的依赖库中,可以在项目内访问库的类和方法,但不知道怎么调用该库实现文本转换功能。

我仅找到一段该库的使用示例代码:

File b =new File("D:\\Chemia\\Clients\\Clients\\Docs\\Equipment\\CCP\\XPSOCRDemo.xps");
IXPSAccess access = new XPSFileAccessImpl(b); 
IXPSFileAccess xpsFileAccess = access.getFileAccess();
XPSDocumentAccessImpl xpsimpl=new XPSDocumentAccessImpl(access); 
int docunum = xpsimpl.getFirstDocNum(); 
IDocumentStructure  structure=xpsimpl.getDocumentStructure(docunum);
             
List<IOutlineEntry> list=(List<IOutlineEntry>)
    structure.getDocumentStructureOutline().getDocumentOutline().getOutlineEntry();
              
list.stream().forEach(restu->{ 
    System.out.println( restu.getOutlineTarget());
});

但运行后我和原帖发布者遇到了相同的空指针异常,无法修复,需要可运行的示例代码才能继续开发。想知道该如何正确使用Java-AXP,或者有没有其他替代方案,我可以接受任何可用的离线处理方案,因为XPS文件包含敏感信息,无法使用在线网站处理。

运行时抛出的异常如下:

Exception in thread "main" java.lang.IllegalStateException: structure must not be null
    at MainKt.main(main.kt:80)
    at MainKt.main(main.kt)

73 | val structure = xpsimpl.getDocumentStructure(0)
80 | val list = structure.documentStructureOutline?.documentOutline?.outlineEntry as List<IOutlineEntry>?

报错原因是xpsimpl.getDocumentStructure(docunum)返回了null。


已验证的可行解决方案

我找到了一个使用Java-AXP的开源项目代码,和我从公开渠道下载的java-axp-core.jar存在部分差异,所以我采用了以下步骤完成配置:

  • 直接拷贝该开源项目中的javaaxp文件夹到我的项目源码目录下
  • 该库依赖Apache Tika,下载tika-app-2.1.0.jar并引入到项目依赖中
  • 修正XPSZipFileAccess.java中的错误导入:
    将import org.apache.tika.io.IOUtils;修改为import org.apache.commons.io.IOUtils;
    修正后Java-AXP的所有引用都可以正常解析
  • 拷贝该项目中的XPSParser.java到我的项目根目录,确认所有导入正常

之后我参考该项目中DocSaver.java的XPSParser调用方法,改编后得到以下可正常运行的XPS转文本代码(Kotlin写法):

val xpsFile = File(path + "filename.xps")
val inputStream = FileInputStream(xpsFile)

val metadata = Metadata()
val handler = BodyContentHandler()

XPSParser().parse(inputStream, handler, metadata, ParseContext())

val docContents = handler.toString()

println(docContents)
inputStream.close()

该方案可以离线完成XPS文件的文本提取,不会泄露敏感数据。

内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:57:03