Codice PHP:
<?php

/*******************************************************************
# STAMPARE BUSTE ED ETICHETTE SINGOLE

# Autore: Piero Maccario - Asti
# Alias:  piero.mac ON html.it-php forum

# Data: 03/05/2003 - Test version only. Per forum html.it-php
#
# Utilizzo: Permette di stampare buste, oppure etichette singole
#             in qualsiasi formato utilizzando esclusivamente
#            uno script PHP prelevando i dati da una tabella mysql.
#           Lo script aggiorna il record stampato per evitare
#           stampe doppie. Ottimizzato per le reti INTRANET.
#           Posizionare nel db la flag "stampato SI/NO" su "NO"  
#           sui record da usare prima di iniziare la stampa.
#
# Build up: PHP 4.3.1 - Mysql 4.0.12 
#
# Compatibilita' OS: Windows 98/ME/XP/2000 - Apache any version.
#
# Richiede: extension=php_printer.dll (file ini.php)
#
*******************************************************************/

# Nell'esempio che segue il posizionamento dei dati e' valido per buste 
# in formato 12 x 18 con stampa del foglio verticale e con un logo .bmp sul 
# lato sx alto. Inserire la busta dal lato largo con la faccia in basso.
# Per altri formati variate le cooordinate x,y delle rispettive variabili

$logo_x 120;         # posizione x di un logo
$logo_y 120;         # posizione y di un logo
$logo "Logo007.bmp"# nome del file in formato .bmp
$text_x 1100;        # posizionamento di colonna. In pixel. 
$text_y 900;         # posizionamento prima riga.
$font_h 60;          # altezza del font (sempre pixel)
$font_w 22;          # larghezza del font
$font_c "Arial";     # nome del font

# connessione al db - preleviamo i nostri dati e contiamoli 
$server "localhost";
$user "root";
$pwd "";
$datab "agenda";
$tabella "soci";
$link mysql_connect ($server$user$pwd) or die ("Mysql dice: " mysql_error() . mysql_errno());
$db mysql_select_db ($datab$link) or die ("Mysql dice: " mysql_error());
$action "select * from $tabella where stampato = 'NO'";
$query mysql_query ($action$link);
$num mysql_num_rows($query);
echo 
"

<h5>Stamperemo n. 
$num buste con i seguenti nominativi:</h5></p>";
$n_busta 1;

# apriamo un thread di lavoro con la stampante. lo facciamo prima del while
$handle=printer_open();

# creazione del font - cfr. il manuale per le molte opzioni e compatibilita'
# [url]http://www.zend.com/manual/ref.printer.php[/url] oppure
# [url]http://forum.html.it/forum/showthread.php?s=&threadid=348674[/url]
# nota: il font deve essere selezionato all'interno del documento di stampa

$font printer_create_font("$font_c"$font_h$font_wPRINTER_FW_NORMALfalsefalsefalse0);

# ciclo di stampa - Estraggo le variabili dall'array per maggior chiarezza.
# Dal contenuto dell'array si puo' vedere come e' composta la tabella "soci".
while ($result mysql_fetch_array ($query))
 {
   
$id  $result["socio_id"];        # campo INT(4) UNSIGNED NOT NULL AUTO INCREMENT
   
$tit $result["titolo"];          # VARCHAR(10)
   
$cog $result["cognome"];         # VARCHAR(20)
   
$nom $result["nome"];            # VARCHAR(20)   
   
$ind $result["indirizzo"];       # VARCHAR(30)
   
$cap $result["cap"];             # INT(5)
   
$cit $result["citta"];           # VARCHAR(30)
   
$sta $result["stampato"];        # CHAR(2) DEFAULT 'NO' 

# finalmente si stampa. Si consiglia di non aprire/chiudere il documento fuori dal while
# Si sono avuti problemi su alcuni PC, problemi non approfonditi visto che si risolvevano
# aprendo e chiudendo ogni volta un documento diverso all'interno del ciclo while.

printer_start_doc($handle,'Stampa Buste');                       # inizio documento
printer_start_page($handle);                                     # inizio pagina
printer_select_font($handle$font);                             # seleziono il font creato
printer_draw_bmp($handle"$logo"$logo_x$logo_y);            # stampo il logo .bmp
printer_draw_text($handle,$tit"$text_x$text_y);            # I riga
printer_draw_text($handle,$nom $cog"$text_x$text_y+80);    # II abbassata di 80 pixel
printer_draw_text($handle,$ind"$text_x$text_y+160);        # perche' 60 pixel del font 
printer_draw_text($handle,$cap - $cit"$text_x$text_y+240); # piu' 20 pixel di spazio, ecc.
printer_end_page($handle);                                       # Fine pagina espelle la busta
printer_end_doc($handle);                                        # Fine documento

# vediamo su monitor cosa stiamo stampando a scopo di feedback  
echo "

<h5>Busta n. 
$n_busta - Stampo: $tit $cog $nom - $ind - $cap $cit</h5></P>";             

# Aggiorniamo il record con l'indicazione di stampato=SI. Questo permette di riprendere
# la stampa evitando di stampare doppioni. Ovvio che prima di iniziare a stampare sara'
# necessario fare un UPDATE di tutti i record posizionando a NO la flag 'stampato'.
# O solo dei record che si vogliono stampare.Ovvio... ma non scontato che ci si ricordi...

$action1 "UPDATE $tabella SET stampato = 'SI' WHERE socio_id = $id";
$query1 mysql_query ($action1$link);
$num1 mysql_affected_rows();    # diamo una controllatina alle gomme...
if ($num1 == 1) {                 # tutto ok
echo "

<h5>Il record di 
$nom $cog e' stato aggiornato</h5></p>";
$n_busta $n_busta +1;           # incrementiamo il num. delle buste stampate
}
else {                            
# acc.. qualcosa e' andato storto
echo "

<h5>Il record di 
$nom $cog non e' stato aggiornato.</h5></p>";
echo 
"

<h5>La stampa in corso viene interrotta.</h5></p>"
;
printer_abort($handle);           # abortiamo lo spool di stampa
printer_close($handle);           # chiudiamo la sessione
exit();                           # ed usciamo dal programma
}
}

# chiudiamo tutte le connessioni
# ciao ciao
printer_close($handle);      
mysql_free_result($query);
mysql_close($link);
?>
That's all.

Ciao a tutti.