首页 > 解决方案 > 使用 Java 将 XPS 文件转换为文本

问题描述

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

Aspose对我来说太贵了。

我找到了Java-AXP,它应该可以完成这项工作,但我没有找到任何文档或示例代码。

我设法在 IntelliJ 中将 Java-AXP 核心添加到我的项目库中。我现在可以从我的项目中访问这些文件。但实际上理解如何使用库来获取文本转换是远远超出我的。

我在这里找到的使用示例代码的唯一尝试:


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());
});
             

但是,我确实得到了与 OP 相同的空指针异常,我无法修复它。我需要一个有效的示例代码才能自己继续。

那么如何使用 Java-AXP 呢?还是有替代库?我愿意使用任何东西。

谢谢你的帮助。

编辑:

@Abra 谢谢。

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) 为空

我不能将网站用于我的目的,因为 XPS 文件包含敏感信息。

编辑:这是我找到的解决方案。

我发现了这个使用 Java-AXP 的 repo。但是,我在Google Code中使用的 java-axp-core.jar 似乎有些不同

所以我将javaaxp 文件夹复制到我的项目中。

它需要 Apache Tika,所以我从Apache Tika下载了 tika-app-2.1.0.jar,并通过 Project Structure 菜单将它包含在我的项目中。

在 XPSZipFileAccess.java 我有一个错误的 IOUtils 导入所以我改变了

import org.apache.tika.io.IOUtils;

import org.apache.commons.io.IOUtils;

现在 Java-AXP 可以解析所有引用。

然后我将XPSParser.java复制到我的项目的根目录并确保所有导入工作。

在第 90 行的DocSaver.java中,我找到了 XPSParser 的使用位置,并调整了代码,以便可以将 XPS 文件转换为文本:

    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()

希望它可以帮助某人。

标签: javaxps

解决方案


这是我找到的解决方案。

我发现了这个使用 Java-AXP 的 repo。但是,我在Google Code中使用的 java-axp-core.jar 似乎有些不同

所以我将javaaxp 文件夹复制到我的项目中。

它需要 Apache Tika,所以我从Apache Tika下载了 tika-app-2.1.0.jar,并通过 Project Structure 菜单将它包含在我的项目中。

在 XPSZipFileAccess.java 我有一个错误的 IOUtils 导入所以我改变了

import org.apache.tika.io.IOUtils;

import org.apache.commons.io.IOUtils;

现在 Java-AXP 可以解析所有引用。

然后我将XPSParser.java复制到我的项目的根目录并确保所有导入工作。

在第 90 行的DocSaver.java中,我找到了 XPSParser 的使用位置,并调整了代码,以便可以将 XPS 文件转换为文本:

    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()

推荐阅读