3

我想在OpenOffice 3.1中获取Writer文档的整个树。我需要收集树中所有元素的数据,而不仅仅是元素。Text

通过加载XTextDocument和做getText()将给出XText元素。更具体地说,使用XEnumerationAccessfromXText只会遍历TextRange.

从 OpenOffice 文档/DevGuide/Text/Iterating_over_Text

com.sun.star.text.Text 的第二个接口是XEnumerationAccess。文本服务枚举文本中的所有段落并返回支持 com.sun.star.text.Paragraph 的对象。这包括表格,因为作者将表格视为支持 com.sun.star.text.TextTable 服务的特殊段落。

这里有一些额外的文档:

段落的文本部分枚举提供确实属于该段落的内容,但不与文本流融合在一起。这些可以是文本框架、图形对象、嵌入对象或锚定在段落、字符或作为字符的图形形状。TextPortionType“TextContent”指示是否有内容锚定在字符或作为字符。如果您有一个 TextContent 部分类型,则您知道有一些形状对象锚定在一个字符上或作为一个字符。

我的测试文档表明我确实获得了XTextContent并且XTextRange可以通过getAnchor(). 但是如何确定我正在收集的内容类型?唯一的方法是getString()。如果对象是嵌入图像,我如何收集其数据?

我正在使用 C++,但我相信 Java 中的解决方案是可移植的。


从答案迁移

由于格式不佳,此评论作为答案发布。

感谢您的答复。

我打算使用 API。

我正在尝试GrahicObjects从文档中收集的示例。通过使用 aXGraphicObjectsSupplier我可以通过getGraphicObjects(). 集合中的对象是并通过给Any打印类型。getValueTypeName()XTextContent

API 描述了该集合包含一个TextGraphicObject“服务”。如何获取它的实例?

4

2 回答 2

0

你的问题的答案会很复杂,但我会尽量让自己理解。

  • 使用 SAX 将文档导出为 XML 会更容易处理。如果使用 XML 方式,则必须实现XDocumentHandler并读取文档(可选择过滤不需要的内容)。剩下的工作将是 XSLT 转换或大型文档的 SAX。

  • 如果您更喜欢仅使用 API,则必须大量使用 XServiceInfoUnoRuntime.queryInterface

于 2009-07-22T01:04:56.577 回答
0

在java中:

XComponentContext xContext = Bootstrap.bootstrap();
XMultiComponentFactory xMCF = xContext.getServiceManager();
Object oDesktop = xMCF.createInstanceWithContext("com.sun.star.frame.Desktop", xContext);
XDesktop xDesktop = UnoRuntime.queryInterface(XDesktop.class, oDesktop);
XComponentLoader xCompLoader = UnoRuntime.queryInterface(XComponentLoader.class, xDesktop);
XComponent xComp = xCompLoader.loadComponentFromURL("file:///C:/test.odt", "_blank", 0, new Boolean(true));
XTextDocument xDoc = UnoRuntime.queryInterface(XTextDocument.class, xComp);
XModel xModel =UnoRuntime.queryInterface( XModel.class, xDoc );
XDrawPageSupplier xDPS = UnoRuntime.queryInterface(XDrawPageSupplier.class, xModel);
XDrawPage xDrawPage = xDPS.getDrawPage();
XShapes xShapes = UnoRuntime.queryInterface( XShapes.class, xDrawPage );
for (int s=0;s<xDrawPage.getCount();s++) {
   XShape xShape = UnoRuntime.queryInterface( XShape.class, xShapes.getByIndex(s) );
   System.out.println(" -- sh.getShapeType: " + xShape.getShapeType());
   System.out.println(" -- sh.getPosition: " + xShape.getPosition().X + "x" + xShape.getPosition().Y);
   System.out.println(" -- sh.getSize: " + xShape.getSize().Width + "x" + xShape.getSize().Height);
}
于 2016-05-27T21:56:31.467 回答