Bonsoir, Le calcul des dimensions d'une sélection d'objets fonctionne,
mais j'ai dû passer le type int en long parce que j'avais des images qui
dépassaient les limites.
J'ai repris ma macro d'exportation d'image et Je l'ai généralisée pour
les formats png et jpeg, soit en pleine page, soit sur la sélection, sur
une base de densité de pixels en DPI, mais en laissant la possibilité de
faire un tableau de dimensions en pixels si l'on souhaite.
Les images sont exportées avec le nom du fichier, le numéro, le nom de
la page, une extension qui dépend si c'est la petite ou la grande image,
dans le répertoire du fichier, avec deux images (une grande et une
petite) pour chaque page. Si vous voulez une seule taille par page,
mettez la même définition et la même extension pour les deux tailles
d'images.
J'ai fait des essais d'exportation en bmp, mais Je ne contrôle pas
correctement les dimensions des grandes images qui plafonnent.
Est-ce que quelqu'un saurait comment sélectionner/déselectionner une
couche en basic ?
Voici donc la mise à jour:
REM ***** BASIC *****
'Exportation automatique de pages Libre office draw vers un format image
bitmap, une image par page
sub ExportFullPng 'exporte la pleine page
ExportImg ("png", false, 220, 100, ".p", ".s")
end sub
sub ExportFullJpg
ExportImg ("jpg", false, 220, 100, ".p", ".s")
end sub
sub ExportSelPng 'exporte uniquement les graphismes de la page
(sélection automatique)
ExportImg ("png", true, 220, 100, ".p", ".s")
end sub
sub ExportSelJpg
ExportImg ("jpg", true, 220, 100, ".p", ".s")
end sub
sub ExportSelBmp 'exporte, mais la définition n'est pas claire, seul le
paramètre de la petite image semble avoir un effet
ExportImg ("bmp", true, 220, 50, ".p", ".s")
end sub
Sub ExportImg (format, selection, dpiLarge, dpiSmall, aEXtp, aEXts)
'Exporte la selection complete de chaque page en fonction de dpi
'aEXtp = 'extension de la grande image
'aEXts = 'extension de la petite image
REM Filter dependent filter properties
Dim aFilterData (10) As New com.sun.star.beans.PropertyValue
Dim sFileUrl As String
Dim oDoc, fDoc, dispatcher AS Object
Dim oDrawPage As Object
Dim curFile, aFile, aPage as String
'aEXtp, aEXts
Dim defdpi as Integer
Dim selWidth,selHeight as Long
Dim cfRed, hratio as double
Dim gsize (2)
'Nomme les pages, pour remplacer le numéro de page - ce qui suit est un
exemple
pageName = array
("sens","pose","tapees","accouplees","battement","volets_pliants","montages_speciaux","types_courants","autres_types","symboles","symboles2","details","loqueteau","tableau","entrees_d_air")
'Vous pouvez imposer les dimensions d'image au lieu des densités de
pixels en remplissant ces tableaux -> les dpi images seront erronés
'arrWidthp = array
(1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,800)
'arrWidths = array (640,576,512,512,576,512,512,576,576,512,512,640,220)
oDoc = ThisComponent
curFile = ThisComponent.getURL()
curFile = Left(curFile, Len(curFile)-4) 'Supprime l'extension de fichier
(.odg)
For i = 0 to oDoc.getDrawPages().Count-1 'Balaye toutes les pages
oDrawPage = oDoc.getDrawPages().getByIndex(i)
oDoc.CurrentController.setCurrentPage(oDrawPage)
if (selection) then
fDoc = oDoc.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(fDoc, ".uno:SelectAll", "", 0,
Array()) 'sélectionne tous les éléments
end if
xView = oDoc.currentController
xObj = xView.currentPage
xSelection = xView.selection
If not(selection) or isEmpty(xSelection) then
xObj = xView.currentPage
selWidth = oDrawPage.Width 'Largeur de la page
selHeight = oDrawPage.Height 'Largeur de la page
else
xObj = xSelection
gsize = calcSize(xObj) 'Calcule la largeur des éléments
sélectionnés
selWidth = gsize(0)
selHeight = gsize(1)
End If
hratio = selHeight/selWidth
aPage = "_p"+ (i+1) 'nom de la page par défaut
' PARAMETRES D'EXPORTATION
aFilterData(0).Name = "PixelWidth"
aFilterData(0).Value = Int(selWidth*(dpiLarge/2540))
on error Resume Next
aPage = "_"+pageName(i) 'nomme la page si eelle est dans un tableau
aFilterData(0).Value = arrWidthp(i) 'définit la largeur si elle
est dans un tableau
on error Goto 0
aFilterData(1).Name = "PixelHeight"
aFilterData(1).Value = Int(hratio*aFilterData(0).Value)
' compression - png
aFilterData(2).Name ="Compression"
aFilterData(2).Value = 9 'de 0 à 9
' entrelacement - png
aFilterData(3).Name ="Interlaced"
aFilterData(3).Value = 0
' transparence (png - doit être faux, sinon problème de lisibilité)
aFilterData(4).Name = "Translucent"
'Paramètres pour exportation jpeg
aFilterData(4).Value = false
aFilterData(7).Name = "Resolution"
aFilterData(7).Value = dpiLarge 'Requis pour fichier bmp, mais
le fonctionnement n'est pas clair
aFilterData(8).Name ="LogicalWidth"
aFilterData(8).Value = aFilterData(0).Value*2540/dpiLarge
aFilterData(9).Name ="LogicalHeight"
aFilterData(9).Value = aFilterData(1).Value*2540/dpiLarge
aFilterData(10).Name ="Quality"
aFilterData(10).Value = 85
oDoc.CurrentController.setCurrentPage(oDrawPage)
sFileUrl = curFile + aPage + aExtp + "." + format
Export (xObj, sFileUrl, aFilterData(), format) 'Exporter grande image
Wait 500
aFilterData(0).Value = Int(selWidth*(dpiSmall/2540))
on error Resume Next
aFilterData(0).Value = arrWidths(i)
on error Goto 0
aFilterData(1).Value = Int(hratio*aFilterData(0).Value)
if format="bmp" then
aFilterData(8).Value = Int(aFilterData(8).Value*dpiSmall/dpiLarge)
aFilterData(9).Value = Int(aFilterData(9).Value*dpiSmall/dpiLarge)
end if
sFileUrl = curFile + aPage + aExts + "." + format
Export (xObj, sFileUrl, aFilterData(), format) 'Exporter petite image
Wait 500
Next i
oDrawPage = oDoc.getDrawPages().getByIndex(0)
oDoc.CurrentController.setCurrentPage(oDrawPage)
End Sub
Sub Export (xObject, sFileUrl As String, aFilterData, format)
Dim xExporter, mediaExt
xExporter = createUnoService( "com.sun.star.drawing.GraphicExportFilter" )
xExporter.SetSourceDocument(xObject)
Dim aArgs (2) As New com.sun.star.beans.PropertyValue
Dim aURL As New com.sun.star.util.URL
aURL.complete = sFileUrl
if format="jpg" then
mediaExt = "jpeg" ' "image/jpg" ne fonctionne pas correctement
else
mediaExt = format
end if
aArgs(0).Name = "MediaType"
aArgs(0).Value = "image/"+mediaExt
aArgs(1).Name = "URL"
aArgs(1).Value = aURL
aArgs(2).Name = "FilterData"
aArgs(2).Value = aFilterData
xExporter.filter(aArgs())
End Sub
function calcSize (oObj) 'oObj est une selection d'objets graphiques
dont on calcule les dimensions
Dim x0, y0, x1, y1 As Long 'La hauteur peut dépasser 32000-> entier long
x0=oObj(0).Position.X
y0=oObj(0).Position.Y
x1=x0+oObj(0).Size.Width
y1=y0+oObj(0).Size.Height
For i=1 To (oObj.Count-1)
If (oObj(i).Position.X<x0) Then x0=oObj(i).Position.X
If (oObj(i).Position.Y<y0) Then y0=oObj(i).Position.Y
If ((oObj(i).Position.X+oObj(i).Size.Width)>x1) then
x1=oObj(i).Position.X+oObj(i).Size.Width
If ((oObj(i).Position.Y+oObj(i).Size.Height)>y1) then
y1=oObj(i).Position.Y+oObj(i).Size.Height
Next i
calcSize = array(x1-x0, y1-y0)
end function
Salutations, Pierre
Le 05/12/2016 à 13:44, Agnès Simonet a écrit :
Merci pour cette version considérablement enrichie.
Pour les autres formats, la difficulté c'est d'obtenir des infos sur
les paramètres d'export. En regardant la fenêtre qui s'affiche quand
on fait Fichier>Exporter pour un format donné on arrive à imaginer ce
qui est possible. Reste à trouver la syntaxe.
Pour la différence entre "PixelWidth" et "LogicalWidth" j'ai trouvé ça :
"Each graphic filter is supporting a property sequence which is called
"FilterData" therein you can set the size in pixel with the properties
"PixelWidth" and "PixelHeight", the logical size (in 1/100mm) can be
set with "LogicalWidth" and "LogicalHeight"."
Pour avoir la taille de la sélection on peut faire ceci :
'****************
'calcul des dimensions en mm*100
'où oObj = oDoc.currentController.selection 'collection de toutes les
formes sélectionnées
Dim x0, y0, x1, y1 As Integer
Dim ObjetLargeur, ObjetHauteur As Integer
x0=oObj(0).Position.X
y0=oObj(0).Position.Y
x1=x0+oObj(0).Size.Width
y1=y0+oObj(0).Size.Height
For i=1 To (oObj.Count-1)
If (oObj(i).Position.X<x0) Then x0=oObj(i).Position.X
If (oObj(i).Position.Y<y0) Then y0=oObj(i).Position.Y
If ((oObj(i).Position.X+oObj(i).Size.Width)>x1) then
x1=oObj(i).Position.X+oObj(i).Size.Width
If ((oObj(i).Position.Y+oObj(i).Size.Height)>y1) then
y1=oObj(i).Position.Y+oObj(i).Size.Height
Next i
ObjetLargeur=x1-x0
ObjetHauteur=y1-y0
'****************
Cordialement
Agnès S.
Le 04/12/2016 17:07, Pierre ROUZEAU a écrit :
Merci, c'est ce que je recherchais, mais le premier message n'est pas
arrivé dans ma boite mail.
J'ai modifié les macros pour :
- Exporter chaque page (dans le répertoire courant, avec le nom du
fichier source+le numéro de page)
- Exporter deux images a des définitions différentes pour chaque page
- Avoir en option un nom à la place du numéro de page, stocké dans un
tableau
Le nombre de pixels n'est pris en compte que s'il est entier, les
valeurs décimales ne marchent pas.
J'ai fait deux variantes
- Export2png qui exporte la totalité de chaque page avec une densité de
pixel définie (en dpi)
- ExportSelPng qui n'exporte que ce qui est visible (sélectionner tout),
avec une largeur d'image fixée en pixels
Pour la deuxième variante, on peut en option saisir des tableaux
définissant la largeur de chaque image. Si le tableau n'est pas rempli,
la largeur par défaut est utilisée.
J'ai essayé de faire une variante d'exportation en jpg, dans ce cas il
faut utiliser les variables LogicalHeight et LogicalWidth avec un
coefficient, mais pour une raison inconnue, Je ne peut pas avoir
d'images de plus de 497 pixels de large.
Salutations, Pierre
REM ***** BASIC *****
Sub Export2png 'Exporte la pleine page sur une densité de pixels
REM Filter dependent filter properties
Dim aFilterData (4) As New com.sun.star.beans.PropertyValue
Dim sFileUrl As String
Dim oDoc AS Object
Dim oDrawPage As Object
Dim curFile, aFile, aPage as string
Dim defdpi as integer
Dim cfRed as double
Dim wd, ht as long
'Ce qui suit est un exemple pour nomme les pages (au lieu de p1, p2,
etc.)
pageName = array ("Nom_Page_1","Nom_Page_2")
defdpi= 160 ' densité de pixel en dpi export pour la grande image
(.p.png)
cfRed = 0.32 'Coefficient de réduction pour l'image réduite (.s.png)
oDoc = thisComponent
curFile = ThisComponent.getURL()
curFile = Left(curFile, Len(curFile)-4) 'Supprime l'extension de fichier
(.odg)
For i = 0 to oDoc.getDrawPages().Count-1 'Balaye toutes les pages
oDrawPage = oDoc.getDrawPages().getByIndex(i)
oDoc.CurrentController.setCurrentPage(oDrawPage)
xObj = oDoc.currentController.currentPage
' PARAMETRES D'EXPORTATION
aFilterData(0).Name = "PixelWidth"
aFilterData(0).Value = Int(oDrawPage.Width*(defdpi/2540))
aFilterData(1).Name = "PixelHeight"
aFilterData(1).Value = Int(oDrawPage.Height*(defdpi/2540))
' compression
aFilterData(2).Name ="Compression"
aFilterData(2).Value = 9 'de 0 à 9
' entrelacement
aFilterData(3).Name ="Interlaced"
aFilterData(3).Value = 0
' transparence
aFilterData(4).Name = "Translucent"
aFilterData(4).Value = false
aPage = "_p"+ (i+1)
on error Resume Next
aPage = "_"+pageName(i)
aFilterData(0).Value = arrWidthp(i)
on error Goto 0
sFileUrl = curFile + aPage + ".p.png"
ExportPng( xObj, sFileUrl, aFilterData() )
Wait 500
aFilterData(0).Value = Int(aFilterData(0).Value * cfRed)
aFilterData(1).Value = Int(aFilterData(1).Value * cfRed)
on error Resume Next
aFilterData(0).Value = arrWidths(i)
on error Goto 0
sFileUrl = curFile + aPage + ".s.png"
ExportPng( xObj, sFileUrl, aFilterData() )
Wait 500
Next i
End Sub
Sub ExportSelPng 'Exporte la selection complete de chaque page sur une
largeur fixée
REM Filter dependent filter properties
Dim aFilterData (8) As New com.sun.star.beans.PropertyValue
Dim sFileUrl As String
Dim oDoc, fDoc, dispatcher AS Object
Dim oDrawPage As Object
Dim curFile, aFile, aPage as string
Dim defdpi, par as integer
Dim cfRed as double
Dim wd, ht as long
'Nomme les pages, pour remplacer le numéro de page - ce qui suit est un
exemple
pageName = array
("sens","pose","tapees","accouplees","battement","volets_pliants","montages_speciaux","types_courants","autres_types","symboles","symboles2","details","loqueteau")
'largeurs par défaut
widthp = 1536 ' Largeur par défaut de la grande image - la hauteur
s'ajuste automatiquement
widths = 576 ' Largeur par défaut de la petite image
'Tableaux des largeurs si non constantes
arrWidths = array
(1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,800)
arrWidths = array (640,576,512,512,576,512,512,576,576,512,512,640,172)
oDoc = ThisComponent
curFile = ThisComponent.getURL()
curFile = Left(curFile, Len(curFile)-4) 'Supprime l'extension de fichier
(.odg)
For i = 0 to oDoc.getDrawPages().Count-1 'Balaye toutes les pages
oDrawPage = oDoc.getDrawPages().getByIndex(i)
oDoc.CurrentController.setCurrentPage(oDrawPage)
' PARAMETRES D'EXPORTATION
aFilterData(0).Name = "PixelWidth"
aFilterData(0).Value = widthp
'aFilterData(1).Name = "PixelHeight"
'aFilterData(1).Value =
' compression
aFilterData(2).Name ="Compression"
aFilterData(2).Value = 9 'de 0 à 9
' entrelacement
aFilterData(3).Name ="Interlaced"
aFilterData(3).Value = 0
' transparence
aFilterData(4).Name = "Translucent"
aFilterData(4).Value = false
aFilterData(6).Name = "ExportMode"
aFilterData(6).Value = 0
fDoc = oDoc.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(fDoc, ".uno:SelectAll", "", 0, Array())
xObj = oDoc.currentController.currentPage
xView = oDoc.currentController
'Select all components of this page
xSelection = xView.selection 'pour pouvoir exporter une sélection
correctement, il faudrait connaitre ses dimensions
If isEmpty( xSelection ) Then
xObj = xView.currentPage
Else
xObj = xSelection
End If
aPage = "_p"+ (i+1)
on error Resume Next
aPage = "_"+pageName(i)
aFilterData(0).Value = arrWidthp(i)
on error Goto 0
oDoc.CurrentController.setCurrentPage(oDrawPage)
sFileUrl = curFile + aPage + ".p.png"
ExportPng (xObj, sFileUrl, aFilterData())
Wait 500
aFilterData(0).Value = widths
on error Resume Next
aFilterData(0).Value = arrWidths(i)
on error Goto 0
sFileUrl = curFile + aPage + ".s.png"
ExportPng (xObj, sFileUrl, aFilterData())
Wait 500
Next i
End Sub
Sub ExportPng( xObject, sFileUrl As String, aFilterData )
Dim xExporter
xExporter = createUnoService(
"com.sun.star.drawing.GraphicExportFilter" )
xExporter.SetSourceDocument(xObject)
Dim aArgs (2) As New com.sun.star.beans.PropertyValue
Dim aURL As New com.sun.star.util.URL
aURL.complete = sFileUrl
aArgs(0).Name = "MediaType"
aArgs(0).Value = "image/png"
aArgs(1).Name = "URL"
aArgs(1).Value = aURL
aArgs(2).Name = "FilterData"
aArgs(2).Value = aFilterData
xExporter.filter( aArgs() )
End Sub
Le 01/12/2016 à 09:28, Agnès Simonet a écrit :
Bonjour,
Le 30/11/2016 21:37, Pierre ROUZEAU a écrit :
Il n'y a pas d'espoir du coté des macros ? Sans enregistreur, comment
connaitre la syntaxe ?
Si, mais il faut lire les réponses à la question posée ;-)
http://listarchives.libreoffice.org/fr/users/msg28946.html
Cordialement
Agnès S.
---
L'absence de virus dans ce courrier électronique a été vérifiée par le
logiciel antivirus Avast.
https://www.avast.com/antivirus
--
---------------------------------------------------------------------------
Pierre Rouzeau - Proud indigenous of old Europe
www.rouzeau.net <http://www.rouzeau.net>
---------------------------------------------------------------------------
---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus
--
Envoyez un mail à users+unsubscribe@fr.libreoffice.org pour savoir comment vous désinscrire
Les archives de la liste sont disponibles à http://listarchives.libreoffice.org/fr/users/
Tous les messages envoyés sur cette liste seront archivés publiquement et ne pourront pas être
supprimés
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.