如何使用OpenOffice CLI库向OO Writer文档插入超链接
问题原因
你遇到的Writer插入超链接报错的核心问题有两个:
- 你插入文本框(TextFrame)后,直接用文档根文本的光标插入URL字段,若你是想把超链接放在文本框内部,没有获取文本框的内部文本对象就直接插入根文本会触发上下文错误;若你是想把超链接放在正文,插入文本框后的光标位置上下文不符合字段插入要求
- 代码中存在一行无用的重复创建超链接实例的代码,虽然不会直接报错,但属于冗余逻辑
解决方案
如果需要把超链接插入到文本框内,先获取文本框的内部文本对象再操作光标插入;如果要插入到正文,调整光标位置或者直接使用更简单的段落属性设置方式实现超链接。以下是修正后的Writer分支代码:
if (fileName.ToLower().EndsWith(".odt")) // OO Writer document { unoidl.com.sun.star.text.XTextDocument xTextDocument = (unoidl.com.sun.star.text.XTextDocument)xComponent; unoidl.com.sun.star.text.XText xText = xTextDocument.getText(); unoidl.com.sun.star.text.XSimpleText xSimpleText = (unoidl.com.sun.star.text.XSimpleText)xText; unoidl.com.sun.star.text.XTextCursor xCursor = xSimpleText.createTextCursor(); unoidl.com.sun.star.lang.XMultiServiceFactory xServiceMan = (unoidl.com.sun.star.lang.XMultiServiceFactory)xTextDocument; // 创建文本框 Object objTextFrame = xServiceMan.createInstance("com.sun.star.text.TextFrame"); unoidl.com.sun.star.text.XTextFrame xTextFrame = (unoidl.com.sun.star.text.XTextFrame)objTextFrame; unoidl.com.sun.star.awt.Size aSize = new unoidl.com.sun.star.awt.Size(15000, 400); ((unoidl.com.sun.star.drawing.XShape)xTextFrame).setSize(aSize); // 插入文本框 xText.insertTextContent(xCursor, xTextFrame, false); // ===== 修正部分开始 ===== // 示例1:将超链接插入到文本框内部 unoidl.com.sun.star.text.XText frameText = xTextFrame.getText(); unoidl.com.sun.star.text.XTextCursor frameCursor = frameText.createTextCursor(); // 示例2:如果要插入到正文,将光标移动到文本框之后,删掉上两行启用下面这行即可 // xCursor.gotoEnd(false); // 删除冗余的重复创建实例代码 Object aHyperlinkObj = xServiceMan.createInstance("com.sun.star.text.TextField.URL"); unoidl.com.sun.star.beans.XPropertySet xPropSet = (unoidl.com.sun.star.beans.XPropertySet)aHyperlinkObj; xPropSet.setPropertyValue( "URL", new uno.Any("http://www.example.org")); xPropSet.setPropertyValue( "Representation", new uno.Any("hyperlink")); unoidl.com.sun.star.text.XTextContent xContent = (unoidl.com.sun.star.text.XTextContent)aHyperlinkObj; // 插入到文本框内部,如果要插正文改用xCursor即可 frameText.insertTextContent(frameCursor, xContent, false); // ===== 修正部分结束 ===== }
额外优化方案
如果你不需要用文本字段实现超链接,也可以直接给选中的文本设置HyperLinkURL属性,写法更简单,兼容性也更好:
xCursor.setString("点击跳转"); xCursor.setPropertyValue("HyperLinkURL", new uno.Any("http://www.example.org"));
内容的提问来源于stack exchange,提问作者Boris_56
相关产品推荐
相关产品推荐

