用OpenOffice API抓取整个文档树
我想抓取OpenOffice中的Writer文档的整个树。我需要收集树中所有元素的数据,而不仅仅是Text
元素。用OpenOffice API抓取整个文档树
通过加载XTextDocument
和做getText()
将给出XText
元素。更具体地说,使用来自XText
的XEnumerationAccess
只会遍历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
的示例。通过使用XGraphicObjectsSupplier
我可以通过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);
}