Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 48
  1. #1

    [PILLOLA] - Stampare buste o etichette singole con PHP

    [PILLOLA] - Stampare buste o etichette singole con PHP

    Ciao a tutti.

    Premessa
    Visto che ogni tanto qualcuno chiede come fare per stampare etichette o
    buste prelevando i dati da mysql, e considerato che dovevo preparare uno script
    per la stampa di buste/etichette singole per uso INTRANET ho pensato di divulgare
    il seguente script sperando di fare cosa gradita ai pochi che utilizzano windows
    (pochi si fa per dire....).

    Si puo' fare referimento alla http://forum.html.it/forum/showthrea...hreadid=348674"
    [PILLOLA] Le funzioni "printer" che sostanzialmente rappresenta una buona raccolta delle info del manuale php.

    Prerequisiti
    Per poter utilizzare il seguente script e' necessario essere su un sistema Windows
    (qualunque) con PHP >= 4.0.4.

    Verifichiamo di avere installato l'estensione PHP per la printer con phpinfo.php:
    extension=php_printer.dll nel file php.ini.
    Nella sezione "printer" dovreste verificare:
    codice:
    Printer Support  enabled  
    Default printing device  HP DeskJet 815C Series Printer (nome vs printer, of course)
    Module state  working  
    RCS Version  $Id: printer.c,v 1.23 2002/05/17 18:49:42 fmk Exp $  
    
    Directive Local - Value Master Value 
    printer.default_printer HP DeskJet 815C Series Printer - HP DeskJet 815C Series Printer 
    Se cosi' e', molto bene siete a posto. Altrimenti...

    Aprite il file php.ini e cercate le seguenti righe:

    codice:
    ;Windows Extensions
    .....
    ;extension=php_printer.dll
    e togliete il commento ( ; ) prima di "extension=php_printer.dll" (lascia stare ;Windows... )

    Ora cercate:
    codice:
    [Printer]
    printer.default_printer = ""
    e scrivete tra le virgolette il nome della vostra printer. es.:
    codice:
    printer.default_printer = "HP DeskJet 815C Series Printer"
    Come si fa a sapere come si chiama la tua printer? Boh! io non lo so,
    tu comunque vai nel pannello di controllo, cerchi le stampanti e leggi il nome.
    Tieni presente che per PHP default_printer sara' quella dichiarata nel file php.ini
    e non quella che potrai cambiare in windows.
    Chiaro questo per tutti, se cambiate la stampante o portate lo script sul PC della
    suocera ricordatevi del nome della stampante nel file php.ini

    Controllate il path delle extensions, che NON e' quello che trovate in :
    PATH AND DIRECTORY, ma bensi' questo qua sotto:
    codice:
    ; Directory in which the loadable extensions (modules) reside.
    extension_dir = D:\php\extensions   (oppure)
    extension_dir = "D:\php\extensions"
    Mettetici o meno le " " php e' indifferente. Mentre invece gli dovete mettere i
    codice:
    \ backslashes
    nel path di windows e gli / slash nel path unix.

    Salvate il file e restartate Apache. Quindi con phpinfo.php verifichiamo che sia ora
    correttamente installata la nostra stampante.

    Nel post che segue trovate lo script che e' self-explanatory. Trovate anche la
    composizione della tabella utilizzata nelle prove utile per chi inizia ora con php
    nel caso ci volesse provare.

    Alcune precisazioni: stampa solo immagini bit map (.bmp). La misura e' in pixel e quindi
    non c'e' corripondenza con l'immagine a video (in stampa saranno piu' piccine).
    In certi situazioni di errore durante le prove si e' reso necessario restartare
    Apache. La prova prevedeva la stampa a range di 50 nominativi (tolta nello script).
    Il numero di record da stampare contemporaneamente dipendera' dalla capacita' dello
    spool di stampa e dalla memoria della vs. printer. Se andate in overflow perderete
    dei dati da stampare senza che sia possibile darvene avviso.

    Aspetto i vs. commenti e migliorie. Grazie e Ciao

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  2. #2
    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.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Grande Piero, già aggiunta al thread in rilievo
    Addio Aldo, amico mio... [03/12/70 - 16/08/03]

  4. #4
    Chiedo scusa ma c'e' una errata corrige da fare nel primo post.
    codice:
    ;Windows Extensions
    .....
    ;extension=php_zip.dll
    E' errato
    codice:
    ;Windows Extensions
    .....
    ;extension=php_printer.dll
    e' l'estensione giusta






    ps.: Della serie meglio tardi che mai.....

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2003
    Messaggi
    534
    Ok! ho provato anche a fare la tabella e funziona.

    Prima dovevo usare WORDS con vari passaggi manuali, Proprio comodo.

    Una domanda: dovrei stampare buste di tipo lungo, formato cm.11 x 22.
    Ma non riesco a fare una conversione tra cm e pixel. Ed ho anche il problema che non mi entrano per il lato largo nella stampante. Si puo' cambiare l'orientamento della stampa da verticale ad orizzontale via php oppure bisogna farlo dal pannello proprieta' della stampante?


  6. #6
    Ciao,

    Scusa se non ho risposto prima, ma ero assente (in tutti i sensi).

    Puoi stampare tutto quello che vuoi anche le etichette su modulo continuo. Le buste per diritto o per traverso.

    Dipende tutto dalla stampante. Con PHP non si riesce ad inviare comandi di gestione della carta, ho provato in tutti i modi. Si riesce a gestire solo vecchie stampanti ad aghi che funzionavano sotto DOS/UNIX.

    Quindi imposti i valori in pixel, tenendo presente che molto approssimativamente in un mm. ci sono 11,38 pixel.

    Quindi una busta 110 x 220 (frm. lungo) corrisponde a circa 1250 x 2500 pixel. Il circa e' il delta che si prendono i vari modelli.
    Piazzi le tue stringhe da stampare e tramite il pannello di controllo andrai a settare le stampante per la stampa del foglio in orizzontale.

    Tutto qui.


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7

    Malfunzionamento

    Ciao, il tuo script è favoloso, ma mi sai dire xchè mi stampa una roba piccolissima invece di riempire lo spazio adatto.
    Va impostato qualcosa sulla stampante?

  8. #8
    Ciao, il tuo script è favoloso, ma mi sai dire xchè mi stampa una roba piccolissima invece di riempire lo spazio adatto.
    Intanto ti ringrazio. Ti diro' che al momento sono riuscito ad utilizzarlo per far stampare le ricevute di pagamento da client remoti (su moduli continui prestampati), utilizzando la stampante del client che viene vista come risorsa di rete dal server.

    Credo tu ti riferisca alle immagini file.bmp. Se invece ti riferisci al testo basta incrementare il valore dei pixel sulle variabili
    codice:
    $font_h = 60;          # altezza del font (sempre pixel)
    $font_w = 22;          # larghezza del font
    $font_c = "Arial";     # nome del font
    Per le immagini il problema e' quello della definizione necessaria per la stampa che e' nettamente maggiore di quella necessaria per lo schermo.
    Quindi per avere una immagine apparentemente identica su stampa di quella che vedi sullo schermo devi considerare un rapporto di 72 x 72 pixel usato sullo schermo con uno di 300 x 300 usato da una normale printer a getto di inchiostro.
    In altre parole assumendo l'inch = 2,5 cm. si ha che l'immagine che su schermo misura appunto 25 x 25 mm. stampata su carta sara' di soli 6 x 6 mm.

    In sostanza i marchi che uso sulle buste ho dovuto reimportarli con lo scanner aumentando la proporzione da 100% a 350%. Sempre in formato bitmap ovviamente. Passando da file di peso 50k a circa 400k.

    Non e' una malfuzione, e' un dato di fatto.


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    ciao piero

    mi interesserebbe sapere se esiste il modo per controllare la grandezza della pagina

  10. #10
    [supersaibal]Originariamente inviato da bubu77
    ciao piero

    mi interesserebbe sapere se esiste il modo per controllare la grandezza della pagina [/supersaibal]
    in che senso... controllare?

    edit.: faccio finta di aver capito.

    In php non hai un limite alla pagina. la definisci tu in base alle coordinate x/y del drawer ... l'importante e' che nello script avanzi riga per riga ...la printer non e' un plotter... e questo a volte rende difficile impostare per bene la pagina. Poi chiudi la pagina e la espelli. Pero' bisogna fare i conti con il driver in windows per quando riguarda la pagina come foglio di carta.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.