Hi Andrew,
Thank you for your answer. In fact I want to create a numbered caption (something like « Figure
1 : my nice caption ») under an inserted image and I want to create a table of figure with these
captions to list all images.
- The image is well inserted
- The Table Of Figure is created and works fine when I add manually an image with a
caption in the generated document.
- This table of Figure doesn’t work for the image inserted programmatically, probably,
because I don’t know how to create properly a numbered caption.
I’m a bit confused about the SetExpression, DependentField, field master, … I will continue to
investigate about that, but if you have some references for me, please don’t hesitate.
Regards,
/Vincent Lorenzo
De : Andrew Pitonyak <andrew@pitonyak.org>
Envoyé : jeudi 5 septembre 2019 22:57
À : LORENZO Vincent <vincent.lorenzo@cea.fr>
Cc : Kaganski Mike <mikekaganski@hotmail.com>; Miklos Vajna <vmiklos@collabora.com>; sos
<sos@pmg.be>; libreoffice@lists.freedesktop.org
Objet : RE: need help to insert an image with a caption with the Libo java API <text:sequence-ref
instead of <text:sequence
Are you looking to insert the caption, or the reference to the caption? I think you want to insert
a reference to a dependent field for a text field master. Does this sound correct?
The text field master, which is of type:
com.sun.star.text.fieldmaster.SetExpression.Figure
But you want to reference a Dependent field. If my guess is correct, this is how I insert a
reference to the first Figure using Basic. Note that there is almost no error checking, so, this
could go very wrong.
Sub Main
Dim oField
Dim oNewField
Dim oText
Dim oCurs
Dim oReferencedField
Dim oEnum
Dim oDispatcher ' Dispatcher object.
Dim oFrame
' Setup to perform a dispatch.
oFrame = ThisComponent.CurrentController.Frame
oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
oText = ThisComponent.getText()
oCurs = ThisComponent.CurrentController.getViewCursor()
oEnum = ThisComponent.getTextFields().createEnumeration()
If Not IsNull(oEnum) Then
Do While oEnum.hasMoreElements()
oField = oEnum.nextElement()
'Inspect oField
If oField.supportsService("com.sun.star.text.TextField.SetExpression") Then
If oField.VariableName = "Figure" Then
Print "Found one"
Exit Do
End If
End If
Loop
End If
' No error checking, I just assume that I found one. DANGER DANGER DANGER
oNewField = ThisComponent.createInstance("com.sun.star.text.textfield.GetReference")
oNewField.ReferenceFieldPart = com.sun.star.text.ReferenceFieldPart.CATEGORY_AND_NUMBER
oNewField.ReferenceFieldSource = com.sun.star.text.ReferenceFieldSource.SEQUENCE_FIELD
oNewField.SequenceNumber = oField.SequenceValue
oNewField.SourceName = "Figure"
oText.insertTextContent(oCurs, oNewField, True)
' This next part will NOT work until after all of the fields have updated.
' So, force an update.
oDispatcher.executeDispatch(oFrame, ".uno:UpdateFields", "", 0, Array())
End Sub
On Thursday, September 05, 2019 10:59 EDT, LORENZO Vincent
<vincent.lorenzo@cea.fr<mailto:vincent.lorenzo@cea.fr>> wrote:
Hello everybody,
Since my last question, I switched task. Now I come back to my LibreOffice task to resolve my
caption problem.
I'm still blocked on this problem. I get a different result compared to my last email, but the
reference for the caption is still not found.
I replace Illustration by Figure, but the problem keeps the same.
I obtain a text:sequence-ref instead of a text:sequence. Does someone know why or which is the API
to use to generate a text:sequence...
My result for the numbering of the caption:
<text:sequence-ref text:reference-format="value" text:ref-name="refFigure0">Erreur : source de la
référence non trouvée</text:sequence-ref> (the french text said "reference not found")
I would like to get :
<text:sequence text:ref-name="refFigure0" text:name="Figure" text:formula="ooow:Figure+1"
style:num-format="1">1</text:sequence>
My java code for that :
Object oReference = xMultiServiceFactory.createInstance("com.sun.star.text.textfield.GetReference");
XPropertySet oReferencePropertySet = UnoRuntime.queryInterface(XPropertySet.class, oReference);
oReferencePropertySet.setPropertyValue("SourceName", "Figure");// I get <text:sequence-ref
oReferencePropertySet.setPropertyValue("ReferenceFieldPart",
ReferenceFieldPart.ONLY_SEQUENCE_NUMBER);
oReferencePropertySet.setPropertyValue("ReferenceFieldSource", ReferenceFieldSource.SEQUENCE_FIELD);
oReferencePropertySet.setPropertyValue("SequenceNumber", 0);// (short) 2);//not requireed ?
XTextContent xRef = UnoRuntime.queryInterface(XTextContent.class, oReference);
localCursor.getText().insertTextContent(localCursor, xRef, false);
Regards,
--
Vincent Lorenzo
-----Message d'origine-----
De : LibreOffice
<libreoffice-bounces@lists.freedesktop.org<mailto:libreoffice-bounces@lists.freedesktop.org>> De la
part de LORENZO Vincent
Envoyé : vendredi 15 février 2019 14:37
À : Kaganski Mike <mikekaganski@hotmail.com<mailto:mikekaganski@hotmail.com>>; Miklos Vajna
<vmiklos@collabora.com<mailto:vmiklos@collabora.com>>; sos <sos@pmg.be<mailto:sos@pmg.be>>
Cc : libreoffice@lists.freedesktop.org<mailto:libreoffice@lists.freedesktop.org>
Objet : [PROVENANCE INTERNET] RE: need help to insert an image with a caption with the Libo java API
Hello everybody,
I thank you for your answers. Yes I want to add an image with a caption programmatically and I want
a caption like this "Illustration 1 : My caption"
To my mind, it would be better/cleaner if I was able to generate the same thing than I do the UI.
Thanks to you, I succeed to build the expected structure for the image and to set a text below it,
but I still have some problems, mainly with the GetReference.
The GetReference generates :
<text:reference-ref text:reference-format="text" text:ref-name="refIllustration0">Erreur : source
de la référence non trouvée</text:reference-ref> (sorry my Libo is in French, it is written "Sorry
: source of the reference not found").
And I would like to get a text:sequence instead of a text:reference, to get this result:
<text:sequence text:ref-name="refIllustration0" text:name="Illustration"
text:formula="ooow:Illustration+1" style:num-format="1">1</text:sequence>
Please, do you know how I can build a text:sequence ?
Please found in attachment the java code I wrote [1], the expect xml structure [2] and the current
xml structure [3].
I know I have some difference between [2] and [3] with the width/height properties and inside the
draw frame, but it is not the subject of this thread.
[1] insertImage.java
[2] expectedResult.xml
[3] currentResult.xml
In addition, I have more generic question, do you know if it exists a documentation, indicating
mapping, between the xml elements and how to get/create them from java ? For example, in xml
svg:width is called Height in the java API, and my Textframe becomes <draw:text-box...<
Best regards,
--
Vincent Lorenzo
-----Message d'origine-----
De : Kaganski Mike [mailto:mikekaganski@hotmail.com]
Envoyé : mercredi 13 février 2019 11:42
À : Miklos Vajna <vmiklos@collabora.com<mailto:vmiklos@collabora.com>>; LORENZO Vincent
<vincent.lorenzo@cea.fr<mailto:vincent.lorenzo@cea.fr>>
Cc : libreoffice@lists.freedesktop.org<mailto:libreoffice@lists.freedesktop.org>
Objet : Re: need help to insert an image with a caption with the Libo java API
On 13.02.2019 12:45, Miklos Vajna via LibreOffice wrote:
Hi,
On Tue, Feb 12, 2019 at 09:27:15AM +0000, LORENZO Vincent
<vincent.lorenzo@cea.fr<mailto:vincent.lorenzo@cea.fr>> wrote:
I would like to add a caption, to an inserted image in a text
document, but I don't find how to do that... Please do you have
pointer/documentation for me ?
I think captions are just a UI feature. The doc model just stores a
text frame around the image and the image is followed by the caption itself.
(I.e. later it's not possible to reliably detect if some content
around an image in a frame was created by hand or using the captions
UI code.)
So you can do the same "manually" using the UNO API. When in doubt,
see what UNO API the ODT import uses to create the doc model based on
the input markup.
And actually, if an image is not intended to be floating, but (as seen in majority of cases) is a
part of normal text flow, then the frame could be not needed at all - simply add an image anchored
as character, then add a paragraph with required style and numbering range field, then continue
with other paragraphs. This makes the document structure clearer. Just an advise based on own
experience.
--
Best regards,
Mike Kaganski
_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org<mailto:LibreOffice@lists.freedesktop.org>
https://lists.freedesktop.org/mailman/listinfo/libreoffice
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.