如何使用 UNO 遍历 OpenOffice/LibreOffice 中的整个文档
How do I iterate over an entire document in OpenOffice/LibreOffice with UNO
我正在编写 java 代码来访问在 Libre Office 中打开的文档。
我现在需要编写一些遍历整个文档的代码,希望以与在编辑器中显示的顺序相同的顺序。
我可以使用这段代码遍历所有普通文本:
XComponent writerComponent=xComponentLoader.loadComponentFromURL(loadUrl, "_blank", 0, loadProps);
XTextDocument mxDoc=UnoRuntime.queryInterface(XTextDocument.class, writerComponent);
XText mxDocText=mxDoc.getText();
XEnumerationAccess xParaAccess = (XEnumerationAccess) UnoRuntime.queryInterface(XEnumerationAccess.class, mxDocText);
XEnumeration xParaEnum = xParaAccess.createEnumeration();
Object element = xParaEnum.nextElement();
while (xParaEnum.hasMoreElements()) {
XEnumerationAccess inlineAccess = (XEnumerationAccess) UnoRuntime.queryInterface(XEnumerationAccess.class, element);
XEnumeration inline = inlineAccess.createEnumeration();
// And I can then iterate over this inline element and get all the text and formatting.
}
但问题是这不包括任何图表对象。
然后我可以使用
XDrawPagesSupplier drawSupplier=UnoRuntime.queryInterface(XDrawPagesSupplier.class, writerComponent);
XDrawPages pages=drawSupplier.getDrawPages();
XDrawPage drawPage=UnoRuntime.queryInterface(XDrawPage.class,page);
for(int j=0;j!=drawPage.getCount();j++) {
Object sub=drawPage.getByIndex(j);
XShape subShape=UnoRuntime.queryInterface(XShape.class,sub);
// Now I got my subShape, but how do I know its position, relative to the text.
}
这给了我所有图表(以及我猜的其他数字),但问题是:我如何找出这些图表相对于模型中文本的位置。我如何获得代表每个图表的光标?
更新:
我现在正在为我的 XShape 寻找锚点,但 XShape 没有 getAnchor() 方法。
但是如果我使用
XPropertySet prop=UnoRuntime.queryInterface(XPropertySet.class,shape);
我得到道具class。
然后我调用 prop.getPropertyValue("AnchorType") 这给了我一个锚点类型 TextContentAnchorType.AS_CHARACTER
但我无法获取锚点本身。没有锚点或文本范围 属性.
顺便说一句:我尝试为 libre office 安装“MRI”,但我能找到的唯一版本是 libreoffice 3.3 作为受支持的版本,它不会在 7.1 版上安装
----- 更新 2 -----
我设法使它工作。事实证明,我的 XShape 也实现了 XTextContent(谢谢 MRI),所以我所要做的就是:
XTextContent subContent=UnoRuntime.queryInterface(XTextContent.class,subShape);
XTextRange anchor=subContent.getAnchor();
XTextCursor cursor = anchor.getText().createTextCursorByRange(anchor.getStart());
cursor.goRight((short)50,true);
System.out.println("String=" + cursor.getString());
这为我提供了指向该段落的光标,然后我可以移动该段落 forward/backward 以找出形状所在的位置。所以这个 println 调用将打印 XShape 之后的 50 个字符。
How do I find out where these charts are positioned in relation to the text in the model. And how do I get a cursor which represent each chart?
删节评论
将对象固定到特定位置。形状是否有方法 getAnchor()
或 属性 AnchorType
?我会使用 MRI 等内省工具来确定这一点。从 https://github.com/hanya/MRI/releases 下载 MRI 1.3.4。
就游标而言,可能类似于表格:
oText = oTable.getAnchor().getText()
oCurs = oText.createTextCursor()
OP给出的代码解决方案
XTextContent subContent=UnoRuntime.queryInterface(XTextContent.class,subShape);
XTextRange anchor=subContent.getAnchor();
XTextCursor cursor = anchor.getText().createTextCursorByRange(anchor.getStart());
cursor.goRight((short)50,true);
System.out.println("String=" + cursor.getString());
我正在编写 java 代码来访问在 Libre Office 中打开的文档。
我现在需要编写一些遍历整个文档的代码,希望以与在编辑器中显示的顺序相同的顺序。
我可以使用这段代码遍历所有普通文本:
XComponent writerComponent=xComponentLoader.loadComponentFromURL(loadUrl, "_blank", 0, loadProps);
XTextDocument mxDoc=UnoRuntime.queryInterface(XTextDocument.class, writerComponent);
XText mxDocText=mxDoc.getText();
XEnumerationAccess xParaAccess = (XEnumerationAccess) UnoRuntime.queryInterface(XEnumerationAccess.class, mxDocText);
XEnumeration xParaEnum = xParaAccess.createEnumeration();
Object element = xParaEnum.nextElement();
while (xParaEnum.hasMoreElements()) {
XEnumerationAccess inlineAccess = (XEnumerationAccess) UnoRuntime.queryInterface(XEnumerationAccess.class, element);
XEnumeration inline = inlineAccess.createEnumeration();
// And I can then iterate over this inline element and get all the text and formatting.
}
但问题是这不包括任何图表对象。
然后我可以使用
XDrawPagesSupplier drawSupplier=UnoRuntime.queryInterface(XDrawPagesSupplier.class, writerComponent);
XDrawPages pages=drawSupplier.getDrawPages();
XDrawPage drawPage=UnoRuntime.queryInterface(XDrawPage.class,page);
for(int j=0;j!=drawPage.getCount();j++) {
Object sub=drawPage.getByIndex(j);
XShape subShape=UnoRuntime.queryInterface(XShape.class,sub);
// Now I got my subShape, but how do I know its position, relative to the text.
}
这给了我所有图表(以及我猜的其他数字),但问题是:我如何找出这些图表相对于模型中文本的位置。我如何获得代表每个图表的光标?
更新: 我现在正在为我的 XShape 寻找锚点,但 XShape 没有 getAnchor() 方法。
但是如果我使用 XPropertySet prop=UnoRuntime.queryInterface(XPropertySet.class,shape);
我得到道具class。
然后我调用 prop.getPropertyValue("AnchorType") 这给了我一个锚点类型 TextContentAnchorType.AS_CHARACTER
但我无法获取锚点本身。没有锚点或文本范围 属性.
顺便说一句:我尝试为 libre office 安装“MRI”,但我能找到的唯一版本是 libreoffice 3.3 作为受支持的版本,它不会在 7.1 版上安装
----- 更新 2 ----- 我设法使它工作。事实证明,我的 XShape 也实现了 XTextContent(谢谢 MRI),所以我所要做的就是:
XTextContent subContent=UnoRuntime.queryInterface(XTextContent.class,subShape);
XTextRange anchor=subContent.getAnchor();
XTextCursor cursor = anchor.getText().createTextCursorByRange(anchor.getStart());
cursor.goRight((short)50,true);
System.out.println("String=" + cursor.getString());
这为我提供了指向该段落的光标,然后我可以移动该段落 forward/backward 以找出形状所在的位置。所以这个 println 调用将打印 XShape 之后的 50 个字符。
How do I find out where these charts are positioned in relation to the text in the model. And how do I get a cursor which represent each chart?
删节评论
将对象固定到特定位置。形状是否有方法 getAnchor()
或 属性 AnchorType
?我会使用 MRI 等内省工具来确定这一点。从 https://github.com/hanya/MRI/releases 下载 MRI 1.3.4。
就游标而言,可能类似于表格:
oText = oTable.getAnchor().getText()
oCurs = oText.createTextCursor()
OP给出的代码解决方案
XTextContent subContent=UnoRuntime.queryInterface(XTextContent.class,subShape);
XTextRange anchor=subContent.getAnchor();
XTextCursor cursor = anchor.getText().createTextCursorByRange(anchor.getStart());
cursor.goRight((short)50,true);
System.out.println("String=" + cursor.getString());