none
Modalità scalata/zoom automatica con PrintDocument? RRS feed

  • Domanda

  • Salve, sto realizzando un piccolo software e avrei l'esigenza di far stampare il contenuto di una Panel (prima salvo la sua PNG, e poi voglio stampare quest'ultima).

    Ho utilizzato PrintDocument (codice in seguito), e imposto la dimensione del PaperSize uguale a quella della Panel. Se stampo su PDF, il risultato è eccellente (cioè quello che mi aspettavo). Se, invece, stampo con una stampante, il risultato è "disastroso".

    In pratica stampa come se fosse impostato uno zoom. Mi chiedo, quindi, esiste qualche impostazione per adattare le dimensioni dell'immagine.

    Per capirci, se apro manualmente l'immagine catturata ("print.png") e uso la funzione "Stampa" del visualizzatore di immagini di Windows, non c'è alcun problema. La stampa avviene correttamente.

    Codice che utilizzo:

    //faccio lo screenshot del panel
    string print_file_path = this.directory_path + "print.png";
    Panel panel_to_use = this.panelDettagli;
    Bitmap bmp = new Bitmap(panel_to_use.Size.Width, altezza_generale);
    panel_to_use.DrawToBitmap(bmp, new Rectangle(Point.Empty, bmp.Size));
    bmp.Save(print_file_path, ImageFormat.Png);
    
    //procedo con la stampa
    PrintDocument pd = new PrintDocument();
    pd.PrintPage += PrintPage;
    pd.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);
    pd.DefaultPageSettings.PaperSize = new PaperSize("Test #1",panel_to_use.Size.Width + 70,panel_to_use.Size.Height + 70);
    pd.DefaultPageSettings.Landscape = false;
    pd.Print();

    giovedì 8 agosto 2019 12:49

Risposte

  • Dunque, implementando la soluzione consigliata ho raggiunto il mio obiettivo.

    Questa è la soluzione che ho implementato:

    private void ButtonPrint_Click(object sender, EventArgs e)
            {
                // effettuo lo screenshot e lo salvo
                string print_file_path = this.directory_path + "print.png";
                Panel panel_to_use = (this.modalita == 1 || this.modalita == 2) ? this.panelDettagliStep : this.panelDettagliMese; // verifico la modalità
                Bitmap bmp = new Bitmap(panel_to_use.Size.Width, altezza_generale);
                panel_to_use.DrawToBitmap(bmp, new Rectangle(Point.Empty, bmp.Size));
                bmp.Save(print_file_path, ImageFormat.Png);
    
                // procedo con la stampa
                PrintDocument pd = new PrintDocument();
                pd.PrintPage += PrintPage;
                pd.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);
                pd.PrintPage += new PrintPageEventHandler(PrintPage);
                pd.DefaultPageSettings.Landscape = false;
                pd.Print();
            }
    
            private void PrintPage(object o, PrintPageEventArgs e)
            {
                Image image = Image.FromFile(this.directory_path + "print.png");
                e.Graphics.DrawImage(image, 10, 10, 810, 1150);
            }

    • Contrassegnato come risposta Sav22999 sabato 10 agosto 2019 17:10
    sabato 10 agosto 2019 17:10

Tutte le risposte

  • Considerato che i formati delle pagine di stampa di una stampante hanno delle dimensioni ben precise, ed hanno dei margini fisici che devono essere rispettati, presumo che la tua PaperSize non venga acquisita dalla stampante, diverso è invece per il PDF perché non credo che il PDF abbia limitazioni sulla dimensione delle pagine.

    E' possibile che se fai una pagina con l'immagine a piena pagina, la stampante la scali in base al formato della carta.

    Se non vuoi che l'immagine sia modificata, prova a lasciare la dimensione della pagina a quella di default e semplicemente disegna la tua immagine e prova a stampare.

    Nel caso non cambi nulla fammi sapere che faccio qualche test in merito.

    saluti


    Sabrina C. - http://www.dotnetwork.it

    giovedì 8 agosto 2019 14:22
  • Buona sera, e grazie mille.

    Non ho ben capito quali modifiche devo effettuare al codice. Gentilmente, potresti condividere uno speudo codice, o se hai qualche minuto, proprio il codice che provo? Grazie.

    Inoltre, sul tuo ragionamento potrebbe essere assolutamente così. Tuttavia, mi viene da domandare se è normale, che se stampo la stessa immagine in maniera esterna al mio software (per l'appunto con il visualizzatore di immagini di windows), venga stampata bene ... senza che imposto nulla. È pur vero che le impostazioni di stampa sono salvate e vengono usate quelle predefinite.

    giovedì 8 agosto 2019 17:54
  • Non ci sono impostazioni di stampa salvabili sulle immagini. Il visualizzatore di immagini per default stampa l'immagine della misura della stessa quindi la fa come tu l'hai salvata.

    La cosa che non vedo nel tuo codice è dove metti l'immagine nel print document

    però quello che farei è non modificare la paper size, inserire l'immagine sul print document e provare.

    al momento non ho modo di preparare un esempio ma dopo il lavoro vedo di fare un paio di test. Stai lavorando con WIndows Forms o WPF?

    Intanto puoi dare un occhiata a 2 articoli in cui uso le stampe ai link seguenti:

    http://www.sabrinacosolo.com/stampare-i-dati-contenuti-in-una-datatable/

    http://www.sabrinacosolo.com/costruire-una-stampa-strutturata-wpf/

    Potrebbero darti delle idee.


    Sabrina C. - http://www.dotnetwork.it

    venerdì 9 agosto 2019 06:58
  • Ciao, dunque sto cercando di implementare la soluzione da te consigliata.

    Gli articoli sono veramente ben scritti, complimenti.

    (Utilizzo Windows Forms)

    venerdì 9 agosto 2019 22:43
  • Dunque, implementando la soluzione consigliata ho raggiunto il mio obiettivo.

    Questa è la soluzione che ho implementato:

    private void ButtonPrint_Click(object sender, EventArgs e)
            {
                // effettuo lo screenshot e lo salvo
                string print_file_path = this.directory_path + "print.png";
                Panel panel_to_use = (this.modalita == 1 || this.modalita == 2) ? this.panelDettagliStep : this.panelDettagliMese; // verifico la modalità
                Bitmap bmp = new Bitmap(panel_to_use.Size.Width, altezza_generale);
                panel_to_use.DrawToBitmap(bmp, new Rectangle(Point.Empty, bmp.Size));
                bmp.Save(print_file_path, ImageFormat.Png);
    
                // procedo con la stampa
                PrintDocument pd = new PrintDocument();
                pd.PrintPage += PrintPage;
                pd.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);
                pd.PrintPage += new PrintPageEventHandler(PrintPage);
                pd.DefaultPageSettings.Landscape = false;
                pd.Print();
            }
    
            private void PrintPage(object o, PrintPageEventArgs e)
            {
                Image image = Image.FromFile(this.directory_path + "print.png");
                e.Graphics.DrawImage(image, 10, 10, 810, 1150);
            }

    • Contrassegnato come risposta Sav22999 sabato 10 agosto 2019 17:10
    sabato 10 agosto 2019 17:10
  • Lieta di esserti stata utile, però, prima di guardare la tua risposta, avevo preparato un esempio in WPF che posterò e così ho agganciato anche l'esempio in Windows forms che hai usato tu, ho solo una osservazione,

    Nel DrawImage io metterei Image.Width e Image.Height nei due ultimi parametri se vuoi stampare l'immagine delle dimensioni reali altrimenti se l'immagine  generica è di dimensione diversa viene deformata.

    saluti


    Sabrina C. - http://www.dotnetwork.it

    domenica 11 agosto 2019 17:21
  • Sì sì, certo. Ho fatto alcuni test e ho notato che nel mio specifico caso si adatta meglio la soluzione di "dimensioni fisse" (questo perché il software deve girare solamente su alcuni dispositivi con uguale risoluzione (1600x900).

    Mi rendo conto che non è assolutamente una soluzione ottima poiché i software dovrebbero girare bene ovunque.

    In ogni caso, nuovamente grazie mille!

    lunedì 12 agosto 2019 10:17