Amélioration script conversion pdf

Bonjour,

j'ai le script ci-dessous qui permet de convertir des images en pdf:

Sub imprimer_pdf(chemin_fichier As String, nom_fichier As String, dateen, ligne)
    Dim nom_image As String
    Const imprimante_pdf As String = "Microsoft Print to PDF"

    '/ impression via imprimante PDF

    CreateObject("Shell.Application").ShellExecute "rundll32.exe", "C:\WINDOWS\System32\shimgvw.dll,ImageView_PrintTo /pt " & Chr(34) & nom_fichier & Chr(34) & " " & Chr(34) & imprimante_pdf & Chr(34), "", "open", 1

    nomFicpdf = dateen & " - " & Worksheets("Ecriture").Range("F" & ligne) & ".pdf"
    CheminDestPDF = ThisWorkbook.Path & "\Budget pieces\" & nomFicpdf
    'MsgBox (CheminDestPDF)

    ' Use SendKeys to automate the save dialog
    Application.Wait (Now + TimeValue("0:00:03"))
    SendKeys CheminDestPDF, True
    Application.Wait (Now + TimeValue("0:00:01"))
    SendKeys "{ENTER}", True

End Sub

cependant il arrive tres souvent que le script coupe les images lors la conversion de sorte a ce que je dois faire une conversion manuelle en parallèle si je veux avoir une version correcte en pdf. aussi ce n'est pas vraiment un gain de temps.

comment procéder afin que le script respecte le ratio de l'image de base en vue de le conversion et ne décide pas de couper aleatoirement ou encore de changer l'orientation?

merci par avance pour votre aide

Hello,

tes images sont de quel type (png, jpg, bmp ...) ? quelles dimensions ? peux-tu mettre en pièce jointe une image qui pose problème et qui ne contient rien de confidentiel ? Et pourquoi faire ceci avec Excel ? Par exemple avec le logiciel gratuit xnview c'est tout de suite plus facile et plus paramètrable :

printpdf

Ami calmant, J.P

Hello,

La plupart du temps ce sont des Jpg

la dimension importe peu car meme si je tente avec un simple ticket de caisse le probleme est le meme.

Je le fais sous Excel car c'est dans le cadre d'un processus automatise de base de donnée.

Hello,

avec Xnview (gratuiciel existe en version portable sans installation) on peut imprimer directement un fichier image avec une commande console du style :

C:\Program Files (x86)\XnView\xnview.exe  /print nom_fichier

XnView va utiliser sa dernière configuration d'imprimante pour imprimer. Le souci c'est que si c'est une imprimante PDF à un moment donné . il va falloir rentrer le nom du fichier pdf de sortie. On va attendre que la fenêtre qui affiche le choix du fichier PDF de sortie soit présente. Si la fenêtre n'est pas détectée il y a un TimeOut pour ne pas rester bloqué. Ensuite on va donner le focus sur la partie Edit de la ComboBox où le nom du fichier PDF est rentré et on va envoyer un Sendkeys sur ce contrôle.

Puisqu'il s'agit ici de "piloter" une fenêtre qui n'est pas une fenêtre Excel, je vais en profiter pour vous parler d'UIAutomation qui fait partie de Windows depuis Windows 7 et qui est utilisable depuis le VBA.
Pour l'utiliser en VBA il faut tout d'abord dans Outils/références cocher UIAutomationClient. Si on ne le voit pas il faut faire parcourir et choisir :
Windows\System32\UIAutomationCore.dll
pour un Excel 64 bits sur un O.S 64 bits ou pour un Excel 32 bits sur un O.S 32 bits.
Windows\SysWow64\UIAutomationCore.dll
pour un Excel 32 bits sur un O.S 64 bits.
Un outil indispensable pour l'utiliser c'est l'outil opensource FlaUInspect qui permet de visualiser tous les éléments d'Interface Utilisateur accessibles. Voici ce que cela donne pour la boîte de dialogue d'impression qui s'ouvre pour imprimer en PDF :

xluiautomation

Et Voici le code :

#If VBA7 Then
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

Sub TestImprimer()
   imprimer_pdf "d:\temp\range.png"
End Sub

Sub imprimer_pdf(nom_fichier As String)
    Dim nom_image As String, cmd
    Dim Resultat As String
    '/ impression via imprimante PDF
    cmd = Chr(34) & "D:\Program Files (x86)\XnView\xnview.exe" & Chr(34) & " /print " & nom_fichier
    PID = Shell(cmd, vbNormalFocus)
    nomFicPdf = "d:\temp\test.pdf"
    PrintWithXnView nomFicPdf
End Sub

Sub PrintWithXnView(nomFicPdf)
Dim c As New CUIAutomation, oPrinting As IUIAutomationElement, oNomFic As IUIAutomationElement
Dim oDesktop As IUIAutomationElement, oCondition As IUIAutomationCondition, res
Set oCondition = c.CreatePropertyCondition(UIAutomationClient.UIA_NamePropertyId, "Printing...")' première fenêtre (fille du Desktop)
Set oDesktop = c.GetRootElement
Set oPrinting = WaitForUiElem(oDesktop, oCondition, TreeScope_Children, 2) 'timeout à 2 secondes
Set oCondition = c.CreatePropertyCondition(UIAutomationClient.UIA_AutomationIdPropertyId, "1001") ' Partie Edit du ComboBox du nom du fichier PDF
Set oNomFic = WaitForUiElem(oPrinting, oCondition, TreeScope_Descendants, 2)
oNomFic.SetFocus: DoEvents: DoEvents ' Focus sur la partie Edit de la ComboBox de nom de fichier
SendKeys nomFicPdf + "{ENTER}", True: DoEvents
End Sub

Function WaitForUiElem(Parent As IUIAutomationElement, _
                       Condition As IUIAutomationCondition, _
                       ByVal TreeScope As TreeScope, TimeOut) As IUIAutomationElement
Dim x As Integer, obj As IUIAutomationElement
x = 0
While Parent.FindFirst(TreeScope, Condition) Is Nothing
   Sleep 100
   Set obj = Parent.FindFirst(TreeScope, Condition)
   x = x + 1
   If x > TimeOut * 10 Then MsgBox "Timeout": End ' si Timeout on Arrête la macro
   'Debug.Print x
Wend
Set WaitForUiElem = Parent.FindFirst(TreeScope, Condition)
End Function

Ami calmant, J.P

Hello,

en fait c'est beaucoup plus simple pour convertir des images en PDF en VBA .

Le principe :

On crée un document word puis on insére l'image à convertir dedans et on la centre. On exporte le document en PDF.

En pièce jointe un classeur qui convertit toutes les images qui se trouvent dans un répertoire, en PDF dans un répertoire de destination.

convimg2pdf

Ami calmant, J.P

9convimg2pdfjp.xlsm (24.30 Ko)
Rechercher des sujets similaires à "amelioration script conversion pdf"