Confessioni di un consulente IT

Script di PDFCreator e Windows 7 64 bit

Posted in Geek Corner by pigreco314 on 16 agosto, 2010

PDFCreator è uno degli strumenti che uso più spesso nella mia giornata lavorativa e non. Per chi ancora non lo conoscesse, trattasi di una utility gratuita e open source per la creazione di file PDF che sfrutta il meccanismo della stampante virtuale. Installando l’utility, alla lista delle stampanti configurate nel computer ne viene aggiunta una denominata PDFCreator: qualunque applicazione può inviare documenti a questa stampante ottenendone la creazione di copie in formato PDF (nonché jpeg, png, bmp, tiff, ps, eps e pcx).

Ultimamente gli autori di PDFCreator sono stati oggetto di  critiche legate alla procedura di installazione di PDFCreator introdotta con la versione 0.9.7 (Febbraio 2009) che per default, a meno che l’opzione non venga esplicitamente de-selezionata, installa una fastidiosa toolbar nei browser IExplorer e Firefox. Nulla di grave in fondo: l’aggiunta della toolbar può essere facilmente evitata facendo attenzione alle schermate presentate durante il processo di installazione o agevolmente rimossa in un secondo tempo.

PDFCreator porta con sé una serie di utilissimi script vbs (reperibili nella directory \PDFCreator\PlugIns\pdfforge) per effettuare sui file PDF operazioni come: l’unione di due o più file (MergePDFFiles), la conversione da formato immagine a PDF (Image2PDF) ecc.

Questi script non funzionano su Windows 7 a 64 bit-

Per esempio, il tentativo di effettuare il merge di due file PDF con il comando

MergePDFFiles file1.pdf file2.pdf

produce l’errore

Could not create object name "pdfforge.pdf.PDF" 80040154

presumo che il motivo sia legato al fatto che la  libreria pdfforge.dll che espone i metodi richiamati dagli script è  compilata a 32 bit mentre l’engine di Windows che esegue lo script (\Windows\system32\wscript.exe) è a 64 bit.

Per risolvere il problema, occorre utilizzare l’engine a 32 bit che in Windows 7 si trova in \Windows\SysWOW64\wscript.exe. Lanciando quindi il comando come:

C:\Windows\SysWOW64\wscript.exe MergePDFFiles file1.pdf file2.pdf

si ottiene il risultato voluto.

Per evitare di digitare ogni volta una linea di comando così lunga, ho messo tutto in uno script wrapper che chiama MergePDFFiles utilizzando l’engine a 32 bit:

'set MergePDFFiles Path
mergeScriptPath = "C:\Program Files (x86)\PDFCreator\PlugIns\pdfforge\MergePDFFiles.vbs"

'determine current directory
curScriptPath = Wscript.ScriptFullName
curDir = fso.GetParentFolderName(curScriptPath)

fileList=""
For i = 0 To objArgs.Count - 1
 fileList = fileList & """" & curDir & "\" & objArgs(i) & """ "
Next

cmdLine = "C:\Windows\SysWOW64\wscript.exe """ & mergeScriptPath & """ " & fileList
Set objShell = CreateObject("WScript.Shell")
objShell.Run cmdLine, 0, FALSE

Un altro ottimo strumento per manipolare file PDF è pdftk (Pdf ToolKit): nella versione Windows il kit è costituito da un unico eseguibile (pdftk.exe) da copiare in una directory inclusa nella variable PATH (per esempio \Windows\System32).

Il merge di due file PDF si ottiene semplicemente con:

pdftk file1.pdf file2.pdf output file_merge.pdf

Tutte le possibilità offerte da pdftk sono descritte nella documentazione online.

Annunci

2 Risposte

Subscribe to comments with RSS.

  1. AG said, on 23 novembre, 2011 at 11:22

    Potrebbe pubblicare uno script completo di testo che chiama il MergePDFFiles motore usando 32-bit (con le variabili all’inizio, ecc)? Sarebbe molto utile per me. Grazie!

    (Could you publish a full text script that calls the engine MergePDFFiles using 32-bit (with variables in the beginning, etc.)? It would be very helpfull for me. Thanks!)

    • pigreco314 said, on 24 novembre, 2011 at 0:52

      Hello AG,
      I abandoned MergePDFFiles in favor of pdftk a while ago and I’m not having fun with the script anymore.
      However, below you can find the full MergePDFFile script I modified and used before I switched to pdftk.
      I hope I understood correctly what you asked:

      ——————–
      Option Explicit

      Dim pdfforge, fso, objArgs, resFile, files(), Scriptname, ScriptBasename, AppTitle, i

      Set fso = CreateObject(“Scripting.FileSystemObject”)

      Scriptname = fso.GetFileName(Wscript.ScriptFullname)
      ScriptBasename = fso.GetFileName(Wscript.ScriptFullname)

      AppTitle = “pdfforge.dll – ” & ScriptBaseName

      If CDbl(Replace(WScript.Version,”.”,”,”)) < 5.1 then
      MsgBox "You need the ""Windows Scripting Host version 5.1"" or greater!", vbCritical + vbSystemModal, AppTitle
      Wscript.Quit
      End if

      Set objArgs = WScript.Arguments

      If objArgs.Count = 0 Then
      MsgBox "Syntax: " & vbtab & Scriptname & " ” & vbcrlf & vbtab & “or use “”Drag and Drop””!”, vbExclamation + vbSystemModal, AppTitle
      WScript.Quit
      End If

      Redim files(objArgs.Count – 1)
      For i = 0 To objArgs.Count – 1
      files(i) = objArgs(i)
      Wscript.echo “File: ” & files (i)
      Next

      Set pdfforge = Wscript.CreateObject(“pdfforge.pdf.pdf”)
      resFile = fso.GetParentFolderName(Wscript.ScriptFullname) & “\MergedPDFs1.pdf”
      MsgBox resFile , vbExclamation + vbSystemModal, “Merge1”
      pdfforge.MergePDFFiles_2 (files), (resFile), false
      resFile = fso.GetParentFolderName(Wscript.ScriptFullname) & “\MergedPDFs2.pdf”
      MsgBox resFile , vbExclamation + vbSystemModal, “Merge2”
      pdfforge.MergePDFFiles_2 (files), (resFile), true

      Set pdfforge = Nothing
      Set fso = Nothing
      Set objArgs = Nothing
      MsgBox “Ready!”

      ——————————-


Rispondi qui

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: