【问题标题】:Convert XPS-File to Text with Java使用 Java 将 XPS 文件转换为文本
【发布时间】:2021-12-24 20:16:12
【问题描述】:

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

Aspose 对我来说太贵了。

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

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

我发现 here 唯一尝试使用带有示例代码的库:


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 的this repo。但是,我使用的 java-axp-core.jar 似乎有些不同 Google Code

所以我将javaaxp folder 复制到我的项目中。

它需要 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()

希望对某人有所帮助。

【问题讨论】:

  • 您好,欢迎您! 1. 识别空值。 2.抓住或修复它! (stackoverflow.com/q/218384/592355)
  • @xerx593 谢谢。结构为空,因此我没有获取文件内容。

标签: java xps


【解决方案1】:

这是我找到的解决方案。

我找到了使用 Java-AXP 的 this repo。但是,我使用的 java-axp-core.jar 似乎有些不同 Google Code

所以我将javaaxp folder 复制到我的项目中。

它需要 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()

【讨论】:

    猜你喜欢
    • 2016-01-19
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2011-02-01
    • 2012-10-09
    • 1970-01-01
    相关资源
    最近更新 更多