[Résolu][Writer] copie 1.odt personnalisée vers 2.odt

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Avatar de l’utilisateur
martinbrait
InconditiOOnnel
InconditiOOnnel
Messages : 753
Inscription : 09 avr. 2013 07:15
Localisation : T'as pas dit bonjour, merci et à bientot !

[Résolu][Writer] copie 1.odt personnalisée vers 2.odt

Message par martinbrait »

Bonjour,

Comment copier séparément, page par page, texte, tableauxtexte, et image d'un documentsource.odt dans un documentcible.odt ?
Comment copier séparément, en inventoriant tous les objets d'une page d'un document writer source, en tenant compte de sa mise en page,
, reporter le contenu de cette page dans la page et intercaler une page droite blanche, dans un autre document writer cible, ouvert,
puis copier la page suivante du document source et ainsi de suite jusqu'à la dernière page ? (75 pages de texte, tableau-texte, image)

Cas d'utilisation :
Dans le cadre de ma communication d'un exemplaire unique de document de spécifications de 75 pages "griffonable",
qui passera de main en main, je dois effectuer une transmission papier (aux fins de me conformer à la coutume locale).
Du coup, pour communiquer de façon visible et efficace, je voudrais imprimer un document de spécification unique,
aéré grâce à l'ajout d'une page droite intercalaire numérotée.

Mon document source fait 75 pages, et mon document cible fera par conséquent 150 pages à cause des pages blanches intercalées.



@ Piaf
C'est promis, je transmettrai à mes 46 collègues, uniquement une seule impression reliée de mon document de spécifications.

Dans le fichier joint, j'ai mis tout les snippets pertinents, autour de ce sujet.
mais j'ai un mal de chien à voir "comment faire simple" pour atteindre l'objectif ! :oops:



BONJOUR A TOUS, nouvelle façon de poser le problème :
Comment convertir en pdf des pages non consécutives ?
Ma difficulté la plus importante est la suivante :
Comment mémoriser des zones (pages) pour les rassembler
en mémoire afin d'exporter tout ce contenu dans un pdf final ?
'Exporter au format pdf des pages choisies.(impression_personnalisee.odt)

Code : Tout sélectionner

'Exporter au format pdf :
Sub ExporterCettePageEnPdf()
Dim oDoc As Object
Dim  cURL As String
oDoc = ThisComponent
Dim CurseurVisible As Object
monDocument = ThisComponent
CurseurVisible = monDocument.CurrentController.ViewCursor
   mesPages = Array(1,23)
   For intX = 0 to UBound(mesPages)
      With curseurVisible
         .jumpToPage(mesPages(intX))
         .jumpToEndOfPage
         oRangeFinPage = .end
         .jumpToStartOfPage
         .gotoRange(oRangeFinPage, true)
      End With
   Next  
   adresseDoc = "private:factory/swriter"
   aCopier = ThisComponent.CurrentController.getTransferable()
   oDoc = StarDesktop.loadComponentFromURL(adresseDoc, "_blank", 0, Array() )
   curseurVisible = oDoc.currentController.viewCursor
   oDoc.CurrentController.Select(curseurVisible)
   oDoc.CurrentController.insertTransferable(aCopier)
   adresseDoc = ConvertToURL("C:\Temp\" & "impression_perso" & ".pdf")
   oDoc.storeToURL( adresseDoc, Array(MakePropertyValue( "FilterName", "writer_pdf_Export" ))  
   oDoc.Close(True)   
End Sub
'==============================================
'Ici, je parviens peu à peu à faire ma copie avec saut de page intercalaire,
'mais le saut de page n'est pas régulièrement disposé.
'================================================================================================

Code : Tout sélectionner

Sub ExporterDans1documentCibleAvecSautsDePages() 
  Dim NbPages As Integer , NumPage As Integer 
  Dim Curseur As Object , oTextCurseur As Object 
  Dim Debut As Variant , Fin As Variant 
  Dim ArgsProprietes(2) As New com.sun.star.beans.PropertyValue  
  Dim Document As Object , Dispatcher As Object     
  Dim Args() 
  Dim oDesktop As Object , oDoc As Object 
  Dim Fichier As String , NomFichier As String 
  Dim Destination As Variant 
  Dim monTexte As Variant
  Dim saut As Object
  Dim curseurCible As Object
  
  
  'Fige l'écran 
  ThisComponent.LockControllers  
  
  'Compte le nombre de pages dans le document   
  Curseur = ThisComponent.currentController.ViewCursor 
  Curseur.GoToEnd(False) 
  NbPages = Curseur.Page 
  
  'On sort s'il n'y a qu'une page 
  If NbPages = 1 Then Exit Sub 
  
  'Positionne le curseur au début du document 
  Curseur.GoToStart( True ) 
  
  
  '--- Spécifie le filtre de conversion --- 
  ArgsProprietes(0).Name = "FilterName"  
  ArgsProprietes(0).Value = "writer_pdf_Export"  
  ArgsProprietes(1).Name = "CompressMode" 
  ArgsProprietes(1).Value = 1
'Boucle sur toutes les pages 
  For NumPage = 1 To NbPages 

    oTextCurseur = ThisComponent.Text.createTextCursor  
    Curseur.gotoRange( oTextCurseur , False ) 
  
    Do While Curseur.Page <> NumPage  
      If Not oTextCurseur.gotoNextParagraph( False ) Then 
        End  
      End If  
      Curseur.gotoRange( oTextCurseur , False )  
    Loop  
  
    Debut = ThisComponent.Text.createTextCursorByRange(oTextCurseur)  
  
    Do While Curseur.Page <> NumPage + 1  
      If Not oTextCurseur.gotoNextParagraph( False ) Then 
        oTextCurseur.gotoEndOfParagraph( False )  
        GoTo MarkIt  
      End If  
        Curseur.gotoRange( oTextCurseur , False )  
    Loop  
  
    oTextCurseur.gotoPreviousParagraph( False )  
    oTextCurseur.gotoEndOfParagraph( False )  
  
    MarkIt:  
    Fin = ThisComponent.Text.createTextCursorByRange( oTextCurseur )  
    'Sélectionne le contenu de la Xeme page  
    Curseur.gotoRange( Debut , False )  
    Curseur.gotoRange( Fin , True )

  
    '--- 
    'Copie la Xeme page sélectionnée 
    Document = ThisComponent.CurrentController.Frame 
    Dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 
    Dispatcher.executeDispatch(Document, ".uno:Copy", "", 0, Array()) 
  
  
  	If NumPage=1 Then'on ne crée qu'un seul document cible
    'Crée un nouveau document Traitement de texte 
    oDesktop = createUnoService("com.sun.star.frame.Desktop") 
    Fichier = "private:factory/swriter" 
    oDoc = oDesktop.LoadComponentFromURL(Fichier, "_blank", 0, Args()) 
    End If
  
    'Effectue un collage dans le nouveau document  
    'on se rend à la fin du document, et on colle la page récupérée
    'gérer de manière particulière le curseur dans ce second document.
	monTexte = oDoc.Text
    CurseurCible = monTexte.createTextCursor    
    CurseurCible.gotoEnd(False) ' ajouter en fin de document
     
    'saut de page systematique, avant collage de la page
	CurseurCible.BreakType = com.sun.star.style.BreakType.PAGE_BEFORE      
    
    Destination = oDoc.CurrentController.Frame 
    Dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 
    Dispatcher.executeDispatch(Destination, ".uno:Paste", "", 0, Array()) 
    
    
    'insertion d'un saut de page dans le document cible
  'ArgsProprietes(0).Name = "Kind"  
  'ArgsProprietes(0).Value = "3"  
  'ArgsProprietes(1).Name = "TemplateName" 
  'ArgsProprietes(1).Value = ""	
  'ArgsProprietes(2).Name = "PageNumber" 
  'ArgsProprietes(2).Value = 0	  
	'dispatcher.executeDispatch(Destination, ".uno:InsertBreak", "", 0, ArgsProprietes()) 
	   


    'Positionne le curseur au début du document source
    Curseur.GoToStart( True ) 
  Next NumPage 
  
  
    'Sauvegarde le nouveau fichier au format odt 
    NomFichier = ConvertToURL( "C:\Temp\" & NumPage & ".odt" ) 
    oDoc.storeAsURL(NomFichier, Args()) 
    'Crée une copie au format pdf 
    NomFichier = ConvertToURL( "C:\Temp\" & NumPage & ".pdf" ) 
    oDoc.storeToUrl( NomFichier , ArgsProprietes()) 
  
    'Ferme le fichier 
    oDoc.Close( False ) 
    '---   

  
  ThisComponent.UnlockControllers 
  MsgBox "Terminé."   
End Sub
Description du document :
'Il s'agit d'un document test de 23 pages,dont la dernière page reste volontairement blanche.
Objectif recherché :
'L'idée consiste à imprimer au format pdf (ou dans tout autre format) les pages dans l'ordre suivant :
(page1-page23);(page2-page23);(page3-page23)...etc... jusqu'à fin de document.
Le document final alterne une page pleine et une page vide (la page 23), pendant 46 page.

Idéalement, un champ numéro de page "imposé" de 1 à 46
apparaîtrait dans un champ d'en-tête libre en lieu et place de la numérotation automatique.


Merci d'avoir la gentillesse de m'aider si vous le pouvez.
A bientôt !
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par martinbrait le 19 août 2017 21:23, modifié 1 fois.
LibreOffice version 5.4.7.2.M6 (x64)
Windows 10
+
LibreOffice version 5.4.7.2.M6 (x64)
Windows 7

#HSQL Database Engine 1.8.0
version=1.8.0

Locale : fr-FR (fr_FR)

Obligation de version


Bonjour, merci et à bientôt !
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer] copie 1.odt vers 2.odt mise en page personnalis

Message par Dude »

martinbrait a écrit :mais j'ai un mal de chien à voir "comment faire simple" pour atteindre l'objectif !
Tu laisses tomber les macros et tu utilises la fonctionnalité du document maître.
Avatar de l’utilisateur
martinbrait
InconditiOOnnel
InconditiOOnnel
Messages : 753
Inscription : 09 avr. 2013 07:15
Localisation : T'as pas dit bonjour, merci et à bientot !

Re: [Writer] copie 1.odt vers 2.odt mise en page personnalis

Message par martinbrait »

Ok Dude, merci.
Je faisais probablement fausse route, en m'attelant à un travail inutilement compliqué.
Evitons de se piéger avec des documents trop longs ! Il faut se former aux documents maîtres.
@+
LibreOffice version 5.4.7.2.M6 (x64)
Windows 10
+
LibreOffice version 5.4.7.2.M6 (x64)
Windows 7

#HSQL Database Engine 1.8.0
version=1.8.0

Locale : fr-FR (fr_FR)

Obligation de version


Bonjour, merci et à bientôt !