Java 使用OpenOffice API获取整个文档树

Java 使用OpenOffice API获取整个文档树,java,c++,openoffice.org,Java,C++,Openoffice.org,我想在3.1中获取一个文档的整个树。我需要收集树中所有元素的数据,而不仅仅是Text元素 通过加载XTextDocument并执行getText()将给出XText元素。更具体地说,从XText使用XEnumerationAccess只会在TextRange上迭代 从OpenOffice文档中: com.sun.star.text.text的第二个接口是XEnumerationAccess。文本服务枚举文本中的所有段落,并返回支持com.sun.star.Text.paragration的对象。

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

通过加载
XTextDocument
并执行
getText()
将给出
XText
元素。更具体地说,从
XText
使用
XEnumerationAccess
只会在
TextRange
上迭代

从OpenOffice文档中:

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

以下是一些附加文档:

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

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

<>我使用C++,但是我相信java中的一个解决方案是可移植的。
从应答迁移而来

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

谢谢你的回复

我打算使用API

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


API描述集合包含一个
TextGraphicObject
“服务”。我如何抓住它的一个例子?

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

  • 将文档导出为XML将 使用SAX更容易处理。如果 使用XML方式,您必须 实现XDocumentHandler并读取 文档(可选)过滤什么 你不需要。其余的工作将是XSLT转换或用于大型文档的SAX

  • 如果您喜欢只使用API, 你得和我一起玩很多 XServiceInfo和UnoRuntime.queryInterface

    • 在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);
      }
      
      XComponentContext xContext=Bootstrap.Bootstrap();
      XMMultiComponentFactory xMCF=xContext.getServiceManager();
      对象oDesktop=xMCF.createInstanceWithContext(“com.sun.star.frame.Desktop”,xContext);
      XDesktop XDesktop=UnoRuntime.queryInterface(XDesktop.class,oDesktop);
      XComponentLoader XComponentLoader=UnoRuntime.queryInterface(XComponentLoader.class,xDesktop);
      XComponent XComponent=XComponentLoader.loadComponentFromURL(“file:///C:/test.odt“,”_blank“,0,新布尔值(真));
      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=unorauntime.queryInterface(XShapes.class,xDrawPage);
      对于(int s=0;s