http://digilander.libero.it/Cenati

Stampare con Windows

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript

 

 

 

 

 

Stampare con Vbscript

Stampare da Windows è sempre stato un problema. Le stampanti, come tutte le risorse, sono potenzialmente condivise da più processi o da più utenti.

Con il DOS, invece, il computer era più personal. Quindi bastava inviare alla stampante una stringa di testo per vederla comparire sulla carta.

Chiariamo subito che in VbScript non c'è nessun comando per gestire la stampa. E' quindi diverso da Visual Basic, che possiede un esteso set di comandi per impostare l'aspetto delle pagine a stampa. Per stampare con Windows bisogna appoggiarsi a qualche programma esterno. Qualche applicazione che permetta di creare un testo tramite script e che abbia un comando di stampa attivabile dalla command line oppure attraverso un collegamento al suo modello ad oggetti.

In questa pagina vedremo come stampare usando il notepad, usando alcune librerie di sistema di Windows, con Word e con altri programmi forniti insieme al sistema operativo.

Stampare con notepad

Notepad è presente in tutte le versioni di Windows. Pur permettendo di fare solo poche cose, è una grande risorsa. Può essere invocato dalla linea di comando con lo switch "/p" che permette di mandare in stampa il file di testo passato come argomento.

Quindi il comando

notepad.exe /p c:\autoexec.bat 

chiede al blocco note di stampare il file autoexec presente nella directory radice. Al termine della stampa, Notepad si chiude automaticamente.

MioFile = "c:\Documenti\Giovanni\prova.txt" 
set WShell=wscript.createobject("Wscript.shell")
wShell.run "notepad.exe /p " & MioFile , 7 , true

Il secondo parametro è stato impostato a 7 e indica che il blocco note deve essere avviato in una finestra minimizzata (presente solo nella barra di Windows in fondo allo schermo. Il parametro True indica di attendere che notepad abbia finito di lavorare prima di terminarlo.

L'inconveniente di questo metodo è che viene stampato anche il nome del file in testa al foglio e il numero di pagina in calce. Per il filename si può ovviare mettendo un nome che sembri un titolo e omettendo l'estensione. Ad esempio se il file si chiama "Report al 10 ottobre", sembrerà un titolo. Invece "stampa.txt" non lo sembrerà.

Chiaramente è possibile scrivere quello che si vuole nel file prima di stamparlo. Le funzioni per creare e modificare con semplicità un documento di testo sono state illustrate trattando il FileSystemObject, al quale rimando per i dettagli.

In questo esempio vediamo invece come chiedere a Windows un nome di file unico, come scriverci qualcosa dentro e come stamparlo con notepad. Il fatto di ottenere dal sistema operativo un filename unico permette di evitare problemi di omonimia di file, rischiando di cancellare o sovrascrivere qualcosa che ci serviva. Oppure causando un errore di runtime perchè si cerca di cancellare un file di sola lettura prima di riscriverlo.

Certamente questi errori si possono evitare. Ad esempio scrivendo i propri testi in file dai nomi originali (non prova.txt, come ho fatto io, ma magari Print7570.tmp) e magari ricordandosi di crearli forzando la cancellazione (nel caso esistano già) e avendo l'accortezza di cancellarli al termine dello script. Il fatto che l'estensione sia TMP, inoltre, lascia intendere che possono essere rimossi senza problemi se appena hanno una data diversa da quella odierna.

'****************************************************** 
'Cenati Giovanni
'http://digilander.libero.it/Cenati
'Esempio di creazione di un file temporaneo,
'scrittura nel file 'e stampa usando Notepad.
'******************************************************
Set fso = CreateObject("Scripting.FileSystemObject")
' Chiede al sistema un nome di file temporaneo.
' Asks Windows a unique temporary file name
tmp = fso.GetTempName
' Chiede al sistema il nome della cartella temp.
' Gets the path of the temp folder
Const tmpFolder=2 path = fso.GetSpecialFolder(tmpFolder)
tmp = path & "\" & tmp
' Questo è il pathname completo del file tmp.
Const ForWriting = 2
Const TristateUseDefault = -2
'Crea il file di testo e ci scrive qualcosa
fso.CreateTextFile tmp
Set FileStream = fso.GetFile(tmp)
set TextStream = FileStream.OpenAsTextStream(ForWriting, TristateUseDefault)
for i=1 to 50
textStream.Write i & VbCrLf
next
'Chiude il file e cancella gli oggetti usati.
TextStream.close set filestream=nothing
set textstream=nothing
'Attiva notepad minimizzato e gli chiede di stampare il file temporaneo
Set WShell = WScript.CreateObject("WScript.Shell")
WShell.run "notepad.exe /p " & tmp, 7, true
'Cancella il file temporaneo e gli oggetti utilizzati.
fso.deletefile tmp
set fso=nothing
set wshell=nothing
'******************************************************

Stampare usando le DLL di Windows

Mi è stato segnalato questo metodo per stampare file in formato htm, rtf ed anche testo.

La libreria MSHTML.dll, installata con Internet Explorer, permette di invocare la finestra di dialogo di stampa ed inviare il documento al dispositivo selezionato. In Windows ME la libreria MsHtml.dll è in C:\Windows\System, mentre in XP è in C:\Windows\System32

Riporto qui sotto il codice relativo all'utilizzo di questa funzione. A me non funzionava, ma Massimo Gagliardi di Software Box snc (www.swbox.it) mi ha segnalato che occorre racchiudere il nome del file tra virgolette.

file="c:\testo.rtf" 
'file="c:\pagina.htm"
'file="c:\testo.txt"
set WShell = CreateObject("wscript.Shell")
WShell.run "Rundll32.exe C:\WINDOWS\SYSTEM32\MSHTML.dll,PrintHTML " & chr(34) & file & chr(34) , 1, true

Appare però la finestra di scelta della stampante.

    Stampare usando Word

Utilizzare Word, se installato, per produrre delle stampe è molto facile.

Nell'esempio riportato qui sotto, l'applicazione viene invocata ma rimane nascosta. In questo modo rimane oscuro all'utente il modo il cui viene preparata la pagina. Per mostrare la finestra di word basterebbe impostare oWord.visible=true.

Vengono impostate alcune costanti utilizzate da Word, i cui valori si possono ottenere facilmente dalla finestra "immediata" dell'editor di visual basic scrivendo un punto di domanda seguito dal nome della costante. Questo è utile quando si registra una macro e la si vuole trasportare in vbs. Dato che le costanti proprie del vba di word devono essere esplicitamente avvalorate in vbs, basta scorrere la macro generata da registratore di word e chiederne il valore nella finestra immediata.

Una volta istanziato l'oggetto, aggiungo un documento vuoto e comincio a scriverci. Prima scelgo un font di caratteri, poi una dimensione, poi il tipo di allineamento del paragrafo. Dopo aver inserito il testo, forzo un "fine paragrafo".

Al termine, chiedo a Word di stampare il documento. Come se si premesse sul tasto "stampa" della barra degli strumenti.

Potrei anche salvare il documento, impostando il percorso ed il nome.

set oWord=createobject("word.application")
' Costanti di word per l'allineamento del testo.
const wdAlignParagraphCenter=1
const wdAlignParagraphLeft=0
const wdAlignParagraphRight=2
const wdAlignParagraphJustify=3
with oWord
.documents.add
.Selection.Font.Name = "Arial"
.Selection.Font.Size = 20
.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
.Selection.TypeText "Titolo"
.Selection.TypeParagraph 'Va a capo
.Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft
.Selection.Font.Name = "Garamond"
.Selection.Font.Size = 12
.Selection.TypeText "Questo è il testo"
.Selection.TypeParagraph 'va a capo
.Selection.TypeText "Questa la seconda riga"
.Selection.TypeParagraph
.Application.PrintOut
'.ChangeFileOpenDirectory "c:\dati"
'.ActiveDocument.SaveAs "temp.doc"
'.ActiveDocument.Close
end with
wscript.quit

Se invece voglio stampare un file già salvato, posso lanciare word con alcuni switch e con il nome del file:

"C:\Programmi\Microsoft Office\Office\WINWORD.EXE" /x /n documento.doc

Ovviamente dovrò farlo tramite un'istruzione wShell.run, come per lanciare il notepad nel primo esempio di questa pagina.

 

Tasto destro: Stampa

Molti tipi di file hanno il comando "stampa" nel menu contestuale che si attiva con il tasto destro del mouse. Questo esempio attiva la stampa di tutti i file contenuti in una determinata directory. Notare che la descrizione della cartella non termina con la barra "\".

Usando un metodo della shell di Windows posso attivare il verbo "print" come è registrato per quel tipo di file.

TargetFolder = "C:\documenti\temp"
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(TargetFolder)
Set colItems = objFolder.Items
For Each objItem in colItems
objItem.InvokeVerbEx("Print")
Next

L'esempio attiva in automatico quello che è descritto nel paragrafo seguente. Funziona come se si scegliesse "stampa" dal menu contestuale, quindi per alcuni tipi di file potrebbe mostrare una finestra di opzioni da confermare (es: file html), mentre per altri documenti potrebbe stampare in automatico la pagina (es: txt) senza necessità di intervento dell'utente.

 

Stampare immagini ed altri tipi di file

Analogamente al comando per stampare chiamando Word, si possono stampare altri tipi di file con i programmi installati sul proprio PC.

Quando si clicca su di un file con il tasto destro, appare un menu contestuale che prevede, tra le altre opzioni, anche la stampa.

Con l'Esplora Risorse è possibile vedere cosa si attiva scegliendo questo comando. Dal menu strumenti scegliere "Opzioni Cartella". Scegliere la scheda Tipi di File. Scorrere l'elenco fino a trovare il tipo di file che interessa e cliccare su "Avanzate". Scegliere il comando di stampa e premere "modifica". Ricopiare il comando che appare. Questo comando può essere invocato per stampare quel tipo di file, avendo l'accortezza di sostituire "%1" con il pathname del file da stampare.

Ecco alcuni esempi.

Per stampare file pdf. Questo esempio presuppone che abbiate installato la versione 5 di Acrobat Reader.

"C:\Programmi\Adobe\Acrobat 5.0\Reader\AcroRd32.exe" /p /h "%1"

Dato che il pathname contiene degli spazi, bisogna racchiuderlo tra virgolette. Ecco come: Apici=chr(34)

Comando=apici & "C:\programmi\Adobe\Acrobat 5.0\....."& apici &" /p /h" & FileDaStampare.pdf

wshell.run Comando,1,true

Per le immagini che possono essere aperte con kodak imaging, se lo avete incluso nell'installazione di Windows, il comando è C:\WINDOWS\kodakprv.exe /p "%1"

Con il Photo Editor, se lo avete installato con Office:

"C:\Programmi\File comuni\Microsoft Shared\PhotoEd\PHOTOED.EXE" /p "%1"

E ovviamente, con la procedura che ho descritto, potete stampare numerosi altri tipi di file.

Cenati Giovanni

 

 
 

© Cenati Giovanni 2004/2010 - http://digilander.libero.it/Cenati - Reventlov at Katamail com

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript