我想在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部分类型,则您知道有一些形状对象锚定在一个字符或一个字符上。
我的测试文档表明我得到XTextContent,XTextRange可以通过getAnchor()
收集。但是,如何确定我收集的内容类型?唯一的方法是getString()
。如果对象是嵌入式图像,我该如何收集其数据?
我正在使用C ++,但我相信Java中的解决方案是可移植的。
从答案迁移
由于格式不佳,此评论会作为答案发布。
感谢您的回复。
我打算使用API。
我正在尝试从文档中收集GrahicObjects
的示例。使用XGraphicObjectsSupplier
我可以通过getGraphicObjects()
获取一个集合。该集合中的对象为Any
,并通过getValueTypeName()
打印该类型,提供XTextContent
。
API描述该集合包含TextGraphicObject
“服务”。我如何获取它的实例?
答案 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);
}