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 !
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
'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 !