2009-07-22 84 views
3

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

通过加载XTextDocument和做getText()将给出XText元素。更具体地说,使用来自XTextXEnumerationAccess只会遍历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部分类型,则知道有形状对象锚定在角色或角色上。

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

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


迁移自答

由于格式不佳,这评论发布作为回答。

感谢您的回复。

我打算使用API​​。

我想从文档中收集GrahicObjects的示例。通过使用XGraphicObjectsSupplier我可以通过getGraphicObjects()获得收藏。来自集合的对象是Any并且通过getValueTypeName()打印该类型给出XTextContent

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

回答

0

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

  • 导出文件的XML将 更容易使用SAX来处理。如果使用 的XML的方式,你将不得不 实施XDocumentHandler和阅读 的文件(有选择地过滤什么 你不需要)。其余的工作是XSLT转换或SAX大文档。

  • 如果你喜欢只使用API​​, 你必须打很多与 XServiceInfoUnoRuntime.queryInterface

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); 
}