请问下这个报错可能是什么原因:
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>24.7</version>=
</dependency>
public String doc2Markdown(String taskId, InputStream inputStream, DocFilterCallerData callerData) throws Exception {
try (inputStream; ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
Document document = new Document(inputStream);
document.getChildNodes(NodeType.SHAPE, true).clear();
document.getChildNodes(NodeType.GROUP_SHAPE, true).clear();
MarkdownSaveOptions markdownSaveOptions = new MarkdownSaveOptions();
DocFilterUtils.docFilter(document, markdownSaveOptions, callerData);
document.save(outputStream, markdownSaveOptions);
String contentString = outputStream.toString();
if (Objects.nonNull(callerData) && Objects.nonNull(callerData.getRemoveTableOfContents())
&& callerData.getRemoveTableOfContents()) {
return DocFilterUtils.removeAnchorTags(contentString);
}
return contentString;
}
}
Caused by: java.lang.IllegalStateException: Not expected other boolex values here.
at com.aspose.words.zzZsr.toBool(Unknown Source)
at com.aspose.words.zzZ7y.zzYgZ(Unknown Source)
at com.aspose.words.zzYwH.visitParagraphStart(Unknown Source)
at com.aspose.words.Paragraph.acceptStart(Unknown Source)
at com.aspose.words.CompositeNode.acceptCore(Unknown Source)
at com.aspose.words.Paragraph.accept(Unknown Source)
at com.aspose.words.CompositeNode.acceptChildren(Unknown Source)
at com.aspose.words.CompositeNode.acceptCore(Unknown Source)
at com.aspose.words.Body.accept(Unknown Source)
at com.aspose.words.zzZo9.zz0l(Unknown Source)
at com.aspose.words.zzZo9.zzZ2u(Unknown Source)
at com.aspose.words.zzXCv.zzZ2u(Unknown Source)
at com.aspose.words.Document.zz0l(Unknown Source)
at com.aspose.words.Document.zzZ2u(Unknown Source)
at com.aspose.words.Document.zzZ2u(Unknown Source)
at com.aspose.words.Document.save(Unknown Source)
@Endergarten
可能的原因
IllegalStateException: Not expected other boolex values here. 是 Aspose.Words for Java 在内部遍历文档节点时抛出的异常,常见的触发场景包括:
| 场景 |
说明 |
解决思路 |
| 文档中包含 Aspose.Words 仍未完全实现的节点(如某些 字段、宏、SmartArt、OLE 对象、复杂表格) |
在转换为 Markdown 时,渲染器会尝试把这些节点解析为布尔表达式(boolex),但当前实现不支持 |
- 先使用 DocumentVisitor 或 docFilter 删除/替换这些节点 - 或者在保存前将文档 简化(仅保留文本、图片、基本段落) |
DocFilterUtils.docFilter 对节点树做了不完整的修改 |
代码中先 clear() 了 Shape、GroupShape,如果 docFilter 再对文档结构进行修改(如删除节点后未更新父子关系),会导致内部状态不一致 |
- 暂时移除 docFilter,确认是否仍报错 - 如果 docFilter 必须保留,检查其中是否有对 Paragraph、Run、Field 等节点的直接 remove 操作,改用 node.remove() 并在删除后 调用 node.getParentNode().removeChild(node) |
| 使用了旧版/不匹配的 Aspose 依赖 |
依赖声明中出现了非法字符 =, 例如 <version>24.7</version>=,导致 Maven 拉取的实际 JAR 不是预期的 24.7 版本 |
- 确认 pom.xml 正确写成 <version>24.7</version> - 清理本地仓库并重新 mvn clean install |
| 文档中包含未受支持的 Markdown 选项 |
MarkdownSaveOptions 某些属性(如 setExportImages(true)、setExportTrackedChanges(true))在特定文档结构下会触发内部布尔表达式解析错误 |
- 简化 MarkdownSaveOptions,例如只保留 setExportImages(true),其余使用默认值 - 逐项打开属性定位具体导致异常的选项 |
关键点:该异常通常来源于 文档结构不一致 或 Aspose.Words 对某类节点的实现缺陷,而不是 save() 方法的使用错误。
步骤排查建议
-
检查 Maven 依赖
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>24.7</version> <!-- 必须去掉多余的 = -->
</dependency>
-
最小化代码(排除 docFilter 的影响)
public String doc2Markdown(InputStream inputStream) throws Exception {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
Document doc = new Document(inputStream);
// 仅保留基本节点,先不清除 Shape/GroupShape
MarkdownSaveOptions options = new MarkdownSaveOptions();
// 简化选项,先关闭所有可选功能
options.setExportImages(true);
options.setExportTrackedChanges(false);
options.setExportComments(false);
doc.save(outputStream, options);
return outputStream.toString(StandardCharsets.UTF_8.name());
}
}
- 如果不报错,说明问题出在
docFilter 或 clear() 代码。
- 如果仍报错,则是文档本身包含 Aspose.Words 暂不支持的元素。
-
定位有问题的文档元素
-
使用 DocumentVisitor 遍历文档,打印节点类型。示例:
class NodeTracer extends DocumentVisitor {
@Override
public int visitParagraphStart(Paragraph paragraph) {
System.out.println("Paragraph: " + paragraph.getText().trim());
return VisitorAction.CONTINUE;
}
@Override
public int visitShapeStart(Shape shape) {
System.out.println("Shape: " + shape.getShapeType());
return VisitorAction.CONTINUE;
}
// 依次实现其他节点的 visit* 方法...
}
// 调用
doc.accept(new NodeTracer());
-
找到出现异常前最后一次打印的节点,它很可能是触发问题的根源。
-
尝试升级到最新的 Aspose.Words 版本(若有 24.8、24.9 之类的更新)
许多内部 bug 在后续发布中已被修复。升级步骤同第 1 步,只需把 <version> 改为最新版。
-
如果必须删除 Shape/GroupShape,请改为:
doc.getChildNodes(NodeType.SHAPE, true).forEach(Node::remove);
doc.getChildNodes(NodeType.GROUP_SHAPE, true).forEach(Node::remove);
- 使用
remove() 而不是 clear()(后者会直接清空集合,可能留下残余引用)。
-
如仍无法解决,请提供以下信息,以便我们定位:
- 完整的异常堆栈(包括最上层的
at com.aspose.words... 行号)
- 触发异常的 Word 文档样本(若涉及敏感信息可脱敏)
DocFilterUtils.docFilter 中的实现代码(尤其是对节点的增删改操作)
带这些信息我们可以在内部复现并给出更精准的补丁或建议。
参考文档
小结
- 确认 Maven 依赖格式正确;
- 先排除
docFilter 与 clear() 的影响;
- 简化
MarkdownSaveOptions,逐项打开定位问题选项;
- 如有必要,升级到最新的 Aspose.Words 版本;
- 若仍报错,请提供文档样本及
docFilter 实现,以便进一步分析。
祝您调试顺利!如果还有其他细节需要帮助,请随时回复。
@Endergarten 请您将有问题的输入文档附在这里以便我们测试。我们会检查问题并提供更多信息。