使用OpenOffice API获取整个文档树

时间:2009-07-22 00:14:54

标签: java c++ openoffice.org

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

加载XTextDocument并执行getText()会得到XText元素。更具体地说,使用XEnumerationAccess中的XText只会迭代TextRange

从OpenOffice文档/DevGuide/Text/Iterating_over_Text

  

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

此处提供了一些其他文档:

  

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

我的测试文档表明我得到XTextContentXTextRange可以通过getAnchor()收集。但是,如何确定我收集的内容类型?唯一的方法是getString()。如果对象是嵌入式图像,我该如何收集其数据?

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


从答案迁移

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

感谢您的回复。

我打算使用API​​。

我正在尝试从文档中收集GrahicObjects的示例。使用XGraphicObjectsSupplier我可以通过getGraphicObjects()获取一个集合。该集合中的对象为Any,并通过getValueTypeName()打印该类型,提供XTextContent

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

2 个答案:

答案 0 :(得分:0)

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

  • 将文档导出为XML会 使用SAX更容易处理。如果 使用XML方式,你必须 实现 XDocumentHandler 并阅读 文件(可选择过滤什么 你不需要)。剩下的工作可能是XSLT转换,也可以是大文档的SAX。

  • 如果您更喜欢只使用API​​, 你必须要玩很多 XServiceInfo UnoRuntime.queryInterface

答案 1 :(得分: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);
}