java - 使用 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()
希望它可以帮助某人。
解决方案
这是我找到的解决方案。
我发现了这个使用 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()
推荐阅读
- datasource - Weblogic 12c 数据源处于挂起模式
- r - 使用“外部”df 传播数据框?
- reactjs - i18next + React + Webpack - getFixedT 不是函数
- mysql - 如果来自多个 UNION 查询的所有结果都为 0,则更新表
- sqlite - SQL 查询 - 根据非排序值限制生成的查询行
- json - Flutter,将Firestore文档中的Json解析为地图失败
- regex - 在正则表达式中捕获未定义数量的项目
- rest - Spring WebMVC 异常处理
- c++ - std::swap 在 std::shared_ptr 之间交换,其中 A 具有动态数组
- javascript - 如何将多个事件处理程序添加到同一个事件?