我正在:尝试以编程方式向图像添加标题,但没有成功... 我希望获得与使用UI相同的结果,也就是说,此结果:
`<text:p text:style-name="Standard">
<draw:frame draw:style-name="fr1" draw:name="Cadre1"
text:anchor-type="char" svg:width="16.432cm" draw:z-index="0">
<draw:text-box fo:min-height="14.841cm">
<text:p text:style-name="Illustration">
<draw:frame draw:style-name="fr2" draw:name="Image1"
text:anchor-type="as-char" svg:width="16.432cm"
style:rel-width="100%" svg:height="14.841cm"
style:rel-height="scale" draw:z-index="1">
<draw:image
xlink:href="Pictures/100002010000026D000002310710B29486C9E685.png"
xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"
loext:mime-type="image/png" />
</draw:frame>
<text:span text:style-name="T1">
<text:line-break />
</text:span>
Illustration
<text:sequence text:ref-name="refIllustration0"
text:name="Illustration" text:formula="ooow:Illustration+1"
style:num-format="1">1</text:sequence>
: My caption
</text:p>
</draw:text-box>
</draw:frame>
</text:p>`
我的问题是如何获取xml元素'
<text:sequence ...> ?
我正在使用unoil 5.4.2(和其他Libo jar)。
答案 0 :(得分:0)
借助Libreoffice开发人员邮件列表,我解决了我的问题。我需要一个textFieldMaster,然后创建一个SetExpression。 我同意,要理解它并不明显...在这里,我发布了我的完整代码,其中包括带有编号标题的图像:
public static void addImageLink(String imageFilePath, String caption, XTextCursor xTextCursor, ODTEditor odtEditor) {
if (false == imageFilePath.startsWith(odtFileIOService.getODTFilePrefix())) {
imageFilePath = odtFileIOService.getODTFilePrefix() + imageFilePath;
}
try {
XMultiServiceFactory xMultiServiceFactory = odtEditor.getXMultiServiceFactory();
Object tmp = xMultiServiceFactory.createInstance("com.sun.star.text.TextFrame"); //$NON-NLS-1$
XTextFrame textFrame = UnoRuntime.queryInterface(XTextFrame.class, tmp);
XPropertySet framePropertySet = createXPropertySet(textFrame);
framePropertySet.setPropertyValue("SizeType", SizeType.VARIABLE); //$NON-NLS-1$
framePropertySet.setPropertyValue("AnchorType", TextContentAnchorType.AS_CHARACTER); //$NON-NLS-1$
framePropertySet.setPropertyValue("ZOrder", 1);// not really sure //$NON-NLS-1$
framePropertySet.setPropertyValue("TextWrap", WrapTextMode.THROUGH); //$NON-NLS-1$
// Creating the service GraphicObject
Object graphicObject = xMultiServiceFactory.createInstance("com.sun.star.text.TextGraphicObject"); //$NON-NLS-1$
// Creating TextContent for GraphicObject
XTextContent graphicContent = UnoRuntime.queryInterface(XTextContent.class, graphicObject);
// Creating bitmap container service
XNameContainer bitmapContainer = UnoRuntime.queryInterface(XNameContainer.class, xMultiServiceFactory.createInstance("com.sun.star.drawing.BitmapTable")); //$NON-NLS-1$
// Inserting image to the container
bitmapContainer.insertByName(imageFilePath, imageFilePath);
PropertySetUtil.setProperty(graphicContent, "AnchorType", TextContentAnchorType.AT_CHARACTER); //$NON-NLS-1$
PropertySetUtil.setProperty(graphicContent, "GraphicURL", bitmapContainer.getByName(imageFilePath)); //$NON-NLS-1$
graphicContent = ImageUtil.resizeImage(graphicContent, imageFilePath, odtEditor.getXTextDocument(), odtEditor.getXMultiComponentFactory(), odtEditor.getXComponentContext());
XPropertySet graphicPropSet = createXPropertySet(graphicContent);
Object heightValue = graphicPropSet.getPropertyValue("Height"); //$NON-NLS-1$
Object widthValue = graphicPropSet.getPropertyValue("Width"); //$NON-NLS-1$
XPropertySet textFrameSet = createXPropertySet(textFrame);
textFrameSet.setPropertyValue("Height", heightValue);// TODO don't work, and should be on the next level... //$NON-NLS-1$
textFrameSet.setPropertyValue("Width", widthValue); //$NON-NLS-1$
xTextCursor.getText().insertTextContent(xTextCursor, textFrame, false);
XTextCursor localCursor = textFrame.getText().createTextCursor();
XParagraphCursor paragraphCursor = UnoRuntime.queryInterface(XParagraphCursor.class, localCursor);
XPropertySet paraSet = createXPropertySet(paragraphCursor);
paraSet.setPropertyValue("ParaStyleName", "Figure");// it works!!! in fact we can't push style which have not been declared and which don't exist by default //$NON-NLS-1$ //$NON-NLS-2$
localCursor.getText().insertTextContent(localCursor, graphicContent, false);
localCursor.gotoEnd(true);
// managing the caption, we need a text field master
XTextFieldsSupplier supplier = UnoRuntime.queryInterface(XTextFieldsSupplier.class, odtEditor.getXTextDocument());
XNameAccess masters = supplier.getTextFieldMasters();
Object masterSetExpressionForFigure = masters.getByName("com.sun.star.text.fieldmaster.SetExpression.Figure"); //$NON-NLS-1$
// create a dependent SetExpression
Object textFieldSetExpression = xMultiServiceFactory.createInstance("com.sun.star.text.textfield.SetExpression"); //$NON-NLS-1$
XPropertySet textFieldSetExpressionPropertySet = UnoRuntime.queryInterface(XPropertySet.class, textFieldSetExpression);
textFieldSetExpressionPropertySet.setPropertyValue("NumberingType", com.sun.star.style.NumberingType.ARABIC); //$NON-NLS-1$
textFieldSetExpressionPropertySet.setPropertyValue("NumberFormat", NumberFormat.NUMBER); //$NON-NLS-1$
textFieldSetExpressionPropertySet.setPropertyValue("Content", "Figure + 1"); //$NON-NLS-1$ //$NON-NLS-2$
XDependentTextField xDependeantTextFIeld = UnoRuntime.queryInterface(XDependentTextField.class, textFieldSetExpression);
// attach the dependent SetExpression to its master
xDependeantTextFIeld.attachTextFieldMaster(UnoRuntime.queryInterface(XPropertySet.class, masterSetExpressionForFigure));
localCursor.getText().insertString(localCursor, "Figure ", false); //$NON-NLS-1$
// insert the SetExpression
localCursor.getText().insertTextContent(localCursor, xDependeantTextFIeld, true);
if (caption != null && !caption.isEmpty()) {
localCursor.getText().insertString(localCursor, ": " + caption, false); //$NON-NLS-1$
}
endParagraph(xTextCursor);
} catch (Exception e) {
Activator.log.error(e);
}
}
几天后,https://git.eclipse.org/c/papyrus/org.eclipse.papyrus-model2doc.git/
类中的有兴趣的人将在公共git org.eclipse.papyrus.model2doc.odt.internal.util.WriteUtil
上推送此代码