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) :
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".
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
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 ?
Partager