Page 1 sur 1

[Résolu][Writer]insérer un cadre dans une page donnée

MessagePublié: 16 Oct 2019 10:11
par jpwitz
Bonjour
J'utilise une macro (proposée par Hubert Lambert -https://forum.openoffice.org/fr/forum/viewtopic.php?f=8&t=61129#p331667-merci à lui) pour intégrer des cadres dans un document.
Mais une fois la page pleine, les cadres suivants se repositionnent sur la même page.
Comment, dans la macro, ajouter une page et positionner le cadre sur cette nouvelle page.
Merci pour votre aide

Code : Tout sélectionner   AgrandirRéduire
sub creerUnNouveauCadre2(posX, posY, name)
        doc = thiscomponent
        T = doc.Text
        csst = com.sun.star.text
        cadre = doc.createInstance("com.sun.star.text.TextFrame")
        cadre.AnchorType = csst.TextContentAnchorType.AT_PAGE      'AT_PARAGRAPH  ' const 0
        cadre.Width = 3500
        cadre.Height = 800
        cadre.HoriOrient = csst.HoriOrientation.NONE  ' const 0
        cadre.HoriOrientPosition = posX
        cadre.VertOrient = csst.VertOrientation.NONE  ' const 0
        cadre.VertOrientPosition = posY
        cadre.Name = name
        doc.Text.insertTextContent(T.Start, cadre, False)
'      xray doc.Text
end sub

Re: [Writer]Comment insérer un cadre dans une page donnée

MessagePublié: 16 Oct 2019 14:06
par Dude
Salut,

jpwitz a écrit:J'utilise une macro (trouvée sur ce forum-merci aux créateurs)

Il est d'usage de citer l'auteur en donnant le lien vers la macro d'origine.

jpwitz a écrit:ajouter une page et positionner le cadre sur cette nouvelle page

L'insertion de page se fait avec la constante com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK.
Le positionnement passe par la création d'un curseur via la méthode createTextCursor.

Re: [Writer]Comment insérer un cadre dans une page donnée

MessagePublié: 17 Oct 2019 08:36
par jpwitz
Comment utiliser cette constante et la méthode?
Un petit bout de code pour mettre en oeuvre.
Merci beaucoup

Re: [Writer]Comment insérer un cadre dans une page donnée

MessagePublié: 17 Oct 2019 14:40
par Dude
jpwitz a écrit:Comment utiliser cette constante et la méthode?

Je pense qu'en faisant un peu de recherche par toi-même, tu trouveras ton bonheur. :)

Et pense à corriger ton erreur :
Dude a écrit:Il est d'usage de citer l'auteur en donnant le lien vers la macro d'origine.

Question de respect envers la Communauté du libre.

Re: [Writer]Comment insérer un cadre dans une page donnée

MessagePublié: 20 Oct 2019 14:24
par jpwitz
Je n'ai toujours pas trouvé.
Je dois être nul :marto:
Toujours pas d'âme charitable?

Re: [Writer]Comment insérer un cadre dans une page donnée

MessagePublié: 20 Oct 2019 16:43
par Dude
Cette routine insère à l'endroit du curseur un saut de page puis se positionne dessus.
Code : Tout sélectionner   AgrandirRéduire
Sub InsertSautPage
   oCurs = ThisComponent.getCurrentController().getViewCursor()
   oDest = oCurs.getText()
   oDest.insertControlCharacter( oCurs, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False )
   oCurs.BreakType = com.sun.star.style.BreakType.PAGE_BEFORE
End Sub

Comme nous sommes hors contexte(*), je te laisse le soin d'adapter.


(*) Fournir le contexte signifie joindre un document explicatif et exhaustif permettant de comprendre la problématique.

Re: [Writer]Comment insérer un cadre dans une page donnée

MessagePublié: 21 Oct 2019 09:04
par jpwitz
Merci pour ce code.
Permettez-moi d'exposer plus clairement mon projet pour créer un trombinoscope:
Au départ, j'ai
1) un dossier photos contenant les photos (type photos d'identités)(ex: Pierre Dupont.jpg , Jacques Durant.jpg, etc...
2) un document writer contenant la liste des nom des fichiers (sans extension)
Pierre Dupont
Jacques Durant
etc...
Mon projet est d'intégrer les photos dans le document, chaque photo dans un cadre créé et positionné par ses coordonnées x,y. La macro 'Trombinoscope' ci-dessous fonctionne bien, si ce n'est que, une fois la page pleine, une nouvelle page est ajoutée et les coordonnées des cadres réinitialisées (x=100, y=100), mais les cadres suivants de positionnent toujours sur la première page et non sur la page nouvellement créée.
Comment rendre la nouvelle page 'active'?
Merci de votre aide.
Ci-dessous l'intégralité du code:
Code : Tout sélectionner   AgrandirRéduire
sub Trombinoscope
   Dim oDoc as Object, i as Integer, txt as String
   oDoc = thisComponent
   For i = 0 To oDoc.CurrentSelection.Count -1
      If Len(oDoc.CurrentSelection.getByIndex(i).String) > 0 Then
         txt = txt & oDoc.CurrentSelection.getByIndex(i).String & Chr(13)
      End If
   Next i
   If Len(txt) > 0 Then MsgBox txt
    Split1= Split(txt,chr$(13))
'    xray split1
   x=100:y=100
    for i=0 to UBound(Split1)-1
      if asc(Split1(i))<32 then fic = mid(Split1(i),2,len(Split1(i))) else fic = Split1(i)    
        creerUnNouveauCadre2(x,y, fic)
        insereImageDanscadreExistant (fic,"I:\Mes documents\photos\"+fic+".jpg",35, fic)
        x=x+3600
        if x>17000 then x=100:y=y+6500   'Rangée suivante
        if y>26000 then             'Ajouter une page et continuer sur la nouvelle page
           x=100:y=100
         oCurs = ThisComponent.getCurrentController().getViewCursor()
         oDest = oCurs.getText()
         oDest.insertControlCharacter( oCurs, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False )
         oCurs.BreakType = com.sun.star.style.BreakType.PAGE_AFTER
        end if
   next
end sub

sub creerUnNouveauCadre2(posX, posY, name)
        doc = thiscomponent
        T = doc.Text
        csst = com.sun.star.text
        cadre = doc.createInstance("com.sun.star.text.TextFrame")
        cadre.AnchorType = csst.TextContentAnchorType.AT_PAGE      'AT_PARAGRAPH  ' const 0
        cadre.Width = 3500
        cadre.Height = 800
        cadre.HoriOrient = csst.HoriOrientation.NONE  ' const 0
        cadre.HoriOrientPosition = posX
        cadre.VertOrient = csst.VertOrientation.NONE  ' const 0
        cadre.VertOrientPosition = posY
        cadre.Name = name
        doc.Text.insertTextContent(T.Start, cadre, False)
'      xray doc.Text
end sub

'*****************************************************************************************************
Sub insereImageDanscadreExistant(nomDuCadre as string, cheminDeLImage as string, tailleEnMm as integer, nomDeLimage as string)
    ' tailleEnCm <=> taille de l'image telle qu'elle aparaîtra dans le document
    Dim monImage as Object
    dim monTexte as object, monCadre as object
    dim curseurCadre as object
    dim graph as Object
    dim proportion as integer

       monCadre = thisComponent.getTextFrames.getByName(nomDuCadre)
       monTexte = monCadre.text
       curseurCadre = monTexte.createTextCursor

       dim Prop(0) As New com.sun.star.beans.PropertyValue
          Graph = CreateUnoService("com.sun.star.graphic.GraphicProvider")
          Prop(0).Name = "URL"
          Prop(0).Value = convertToURL(cheminDeLImage)
          monImage = thisComponent.createInstance("com.sun.star.text.GraphicObject")
       With monImage
          .Graphic = graph.queryGraphic(Prop()) 'recupere le fichier image
          .AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
       end With
       monTexte.InsertTextContent(curseurCadre, monImage, False)
       proportion = monImage.Height / monImage.Width
       monImage.Width = tailleEnMm*100 ' largeur en 1/100 de mm
       monImage.Height = monImage.Width * proportion *1.3
       monTexte.insertString(curseurCadre, chr(13)+nomDeLimage, False)
end sub

Re: [Writer]Comment insérer un cadre dans une page donnée

MessagePublié: 21 Oct 2019 11:12
par Dude
Bis repetitae :
Dude a écrit:(*) Fournir le contexte signifie joindre un document explicatif et exhaustif permettant de comprendre la problématique.


Et sans doute qu'utiliser la fonction Tableau plutôt que des cadres faciliterait l'insertion des photos.

Re: [Writer]Comment insérer un cadre dans une page donnée

MessagePublié: 07 Jan 2020 10:33
par micmac
Dernière visite de l'intéressé(e) le : 23 Oct 2019 19:48
N'ayant plus de nouvelles, on peut en déduire que le problème est résolu ou ne se reproduit plus.

Merci de baliser par vous-même la prochaine fois.
Un remerciement fait aussi plaisir aux bénévoles qui vous ont consacré de leur temps..