IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Discussion :

Fusion de PDF d'abord avec cprintfile, puis finalement pdfforge


Sujet :

VBA

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingé électro
    Inscrit en
    Septembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingé électro

    Informations forums :
    Inscription : Septembre 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Fusion de PDF d'abord avec cprintfile, puis finalement pdfforge
    Bonjour à tous,

    J'utilise sur VBA la commande cprintfile pour générer des PDF dans le but de les fusionner avec PDFCreator par la suite. Voici le code en question pour un exemple de 3 PDF à fusionner (j'ai plus le nom de l'auteur désolé) (voir ligne 57 pour les cprintfile) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    Sub bindPDF(fnameout$)
     
     Dim pdfjob As PDFCreator.clsPDFCreator
     Dim sPDFName As String
     Dim sPDFPath As String
     Dim DefaultPrinter$
     Dim bRestart As Boolean
     
     Dim sFilenames(3) As String
     
     sFilenames(1) = "T:\_USERS\ECOR\Projet Macro Priorité 1\Dossier test\Yo-test.docx"
     sFilenames(2) = "T:\_USERS\ECOR\Projet Macro Priorité 1\Dossier test\Yo-pdf - Copy.pdf"
     sFilenames(3) = "T:\_USERS\ECOR\Projet Macro Priorité 1\Dossier test\Yo-pdf - Copy - Copy.pdf"
     
     '/// Change the output file name here! ///
     sPDFName = fnameout
     
     '' stub here
     sPDFPath = "C:\Users\me\Desktop"
     
     'Activate error handling and turn off screen updates
     On Error GoTo EarlyExit
     ' Application.ScreenUpdating = False
     Set pdfjob = New PDFCreator.clsPDFCreator
     
     'Check if PDFCreator is already running and attempt to kill the process if so
     Do
     bRestart = False
     Set pdfjob = New PDFCreator.clsPDFCreator
     If pdfjob.cStart("/NoProcessingAtStartup") = False Then
     'PDF Creator is already running. Kill the existing process
     Shell "taskkill /f /im PDFCreator.exe", vbHide
     DoEvents
     Set pdfjob = Nothing
     bRestart = True
     End If
     Loop Until bRestart = False
     
     'Assign settings for PDF job
     With pdfjob
     .cOption("UseAutosave") = 1
     .cOption("UseAutosaveDirectory") = 1
     .cOption("AutosaveDirectory") = sPDFPath
     .cOption("AutosaveFilename") = sPDFName
     .cOption("AutosaveFormat") = 0 ' 0 = PDF
     DefaultPrinter = .cDefaultPrinter
     .cDefaultPrinter = "PDFCreator"
     .cClearCache
     End With
     
     'Delete the PDF if it already exists
     If Dir(sPDFPath & sPDFName) = sPDFName Then Kill (sPDFPath & sPDFName)
     
     'Print the document to PDF
     With pdfjob
     ' change this filename each loop
     .cPrintFile (sFilenames(1))
     Application.Wait Now + TimeValue("0:0:2")
     .cPrintFile (sFilenames(2))
     Application.Wait Now + TimeValue("0:0:2")
     .cPrintFile (sFilenames(3))
     Application.Wait Now + TimeValue("0:0:2")
     
     'Wait until all the print jobs have entered the queue
     Do Until pdfjob.cCountOfPrintjobs = 3
     DoEvents
     Loop
     .cCombineAll
     .cPrinterStop = False
     
     End With
     'Wait until the PDF file shows up then release the objects
     Do Until pdfjob.cCountOfPrintjobs = 0
     DoEvents
     Loop
     
     'Wait a bit longer for PDF Creator to finish
     Application.Wait Now + TimeValue("0:0:2")
     
     'reset original Windows' default printer
     pdfjob.cDefaultPrinter = DefaultPrinter
     pdfjob.cClose
     
    Cleanup:
     'Release objects and terminate PDFCreator
     Set pdfjob = Nothing
     Shell "taskkill /f /im PDFCreator.exe", vbHide
     On Error GoTo 0
     'Application.ScreenUpdating = True
     Exit Sub
     
    EarlyExit:
     'Inform user of error, and go to cleanup section
     MsgBox "There was an error encountered. PDFCreator has" & vbCrLf & _
     "has been terminated on file " & sPDFName & " in bind. Please try again.", _
     vbCritical + vbOKOnly, "Error"
     Resume Cleanup
     
     End Sub
    Le problème que j'ai c'est qu'après l'exécution de la commande cprintfile pour un PDF, Adobe reste ouvert (le PDF s'est fermé mais pas l'application) et tant qu'Adobe reste ouvert le code ne se poursuit pas, j'obtiens même un message d'erreur : "Microsoft Excel is waiting for another application to complete an OLE action" (l'action en question est la fermeture manuelle d'Adobe). Le site PDFFORGE me l'a confirmé : "After printing PDF files with Adobe Acrobat Reader, the program window will not close anymore. This behavior can't be be influenced by the user. You can use an alternative application to print the PDF file, i.e. Foxit Reader".

    J'ai essayé de killer Adobe une fois la commande cprintfile terminée mais en fait tant qu'Adobe reste ouvert la commande ne se termine pas.

    Du coup j'ai pensé à une tâche de fond qui inspecterait l'état d'Adobe et qui, dès qu'elle repère qu'Adobe est lancée, attend quelques secondes (le temps que le cprintfile se fasse) et ferme Adobe sans autre forme de procès.

    Pensez-vous qu'une telle tâche existe ?

  2. #2
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, pour la fusion via PDFCreator voir : Fusion de fichiers PDF / Fusion des PDF d'un Dossier

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingé électro
    Inscrit en
    Septembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingé électro

    Informations forums :
    Inscription : Septembre 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Purée c'est dingue ça, pourquoi je tombe pas sur des solutions aussi simples quand je cherche sur Google ...

    Un grand merci Kiki ! (le 29 c'est pour l'âge ou le Finistère ?)

    Je me permets d'autres questions du coup, maintenant que j'ai capté l'attention, héhé :
    1) Dans la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Pdf As Object, Fichiers(2)
    Que signifie le fait de mettre ", Fichiers(2)" après la définition de "Pdf" ? Y a-t-il un équivalent qui commencerait par "Dim" ? (par exemple Dim Fichiers as double(2) ou un truc comme ça)

    2) Est-ce que l'objet "pdfforge.pdf.pdf" fonctionne avec une Librairie en particulier ? (que je sache si je dois imposer cette Librairie au client)

  4. #4
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, Fichiers(2) parce que 3 fichiers dans ce tableau de l'exemple, sinon voir le 2eme exemple du post ( Fusion des PDF d'un Dossier ) avec Tableau() quand le nombre de fichiers n'est pas connu.
    Public Sub MergePDFFiles ( _
    ByRef sourceFilenames As Object(), _
    destinationFilename As String, _
    filenamesAsBookmarks As Boolean _
    )
    Pour ce qui est de CreateObject("pdfforge.pdf.pdf") il faut avoir installé PDFCreator 1.7.3
    ici l'appel se fait en Late Binding
    Pour le 29 voir dans Profil, la Localisation.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingé électro
    Inscrit en
    Septembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingé électro

    Informations forums :
    Inscription : Septembre 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    D'accord, je comprends mieux. De nouveau un grand merci ! Et bravo pour la page avec tous tes outils VBA/PDF, ça doit aider un bon paquet de gens !

    (Cool de se faire aider par un compatriote départemental ^^)

  6. #6
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    C'est le but, il y a une Liste des contributions et téléchargements personnalisable qui permet de naviguer plus facilement (?) dans le bazar.

    A titre de curiosité un exemple de fusion via cCombineAll

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 17
    Dernier message: 16/05/2016, 17h25
  2. Réponses: 0
    Dernier message: 23/01/2015, 16h00
  3. Réponses: 1
    Dernier message: 16/01/2012, 09h16
  4. [MySQL] création d'un script en tâche de fond pour mysql
    Par boubourse92 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/12/2007, 09h54
  5. Comment faire pour killer une application ?
    Par tintin22 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 17/08/2004, 18h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo