Output di un grafico più grande di A4 su stampante

di il
21 risposte

Output di un grafico più grande di A4 su stampante

Ciao a tutti i bit-pal ,
non riesco a risolvere questo problema ( C# VisualStudio ) creo un grafico
public Bitmap FAA;
public Graphics g;
FAA = new Bitmap(3000, 10000); // più grande del formato A4
g = Graphics.FromImage(FAA);
public PrintDocument pd;
pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
metto nel grafico un diagramma cartesiano e tabelle di dati incolonnati , quindi lo video
void pd_PrintPage(object sender, PrintPageEventArgs e) {
e.Graphics.DrawImage(FAA, new Rectangle(0, 0, FAA.Width, FAA.Height)); }
nessun problema : posso vederlo completo in anteprima con scrolling orizzontale e verticale, posso salvarlo su disco in un file .png e rivederlo con programmi tipo GIMP 2 e PAINT
ma NON riesco a stamparlo ( brother MFC - L27000N ) : ottengo solo una pagina ( il primo formato A4 )
Ho provato a suddividere il grafico in più sottografici piccoli senza successo : ( ho curato la sola parte verticale )
void pd_PrintPage(object sender, PrintPageEventArgs e) {
// e.Graphics.DrawImage(FAA, new Rectangle(0, 0, FAA.Width, FAA.Height));
GraphicsUnit units = GraphicsUnit.Pixel;
float y = 0.0F;
float x = 0.0F;
int ri;
ri = FAA.Height / 827 + 1;
for (int j = 0; j < ri; j++) {
x = j * 827.0F;
RectangleF srcRect = new RectangleF(y, x, 827.0F, 1169.0F);
e.Graphics.DrawImage(FAA, y, x, srcRect, units); }
Errori ?? Qualche suggerimento ?? Grazie per l'attenzione

21 Risposte

  • Re: Output di un grafico più grande di A4 su stampante

    La tua stampante gestisce il formato A3?
    se non lo gestisce devi scompattare il grafico in più pagine e poi lo stampi
    cosi come lo gestisci tu gestisci solo una pagina metre in questo caso sono più pagine che devi gestire.
    ricordati che ogni volta che stampa una pagina prima di stampare la successiva devi ripulire il buffer.
    perchè non crei un PDF?
  • Re: Output di un grafico più grande di A4 su stampante

    Grazie per l'attenzione smalldragon ,
    non credo che la mia stampante gestisca il formato A3 , in ogni caso il problema è teoricamente più ampio del formato A3 .
    Ho provato a salvare in .PDF ma il risultato è lo stesso : stampa solo la prima pagina
    Non ho specificato che le mie conoscenze sono molto limitate . Riprendo a programmare per puro diletto dopo 40 anni di interruzione e non avrebbe senso dedicare la maggior parte del mio tempo residuo ad apprendere la galassia di VisualStudio / C# per trovare la parte infinitesimale che mi occorre . Per questo mi rivolgo al Forum , sperando (come è successo) di trovare persone generose che mi possano indirizzare .
    Ho capito che devo scomporre il grafico in più parti . Ho provato con le istruzioni che ho mostrato . Sono sicuramente errate / incomplete ma sono arrivato fino a quel punto e mi sono impantanato . Qualche suggerimento ??
  • Re: Output di un grafico più grande di A4 su stampante

    Intanto hai sbagliato sezione del forum
  • Re: Output di un grafico più grande di A4 su stampante

    Per gestire le pagine occore la PrintPageEventHandler Delegate il link con le modalita d'uso e questo
    https://docs.microsoft.com/en-us/dotnet/api/system.drawing.printing.printpageeventhandler?view=dotnet-plat-ext-6.0
    comunque un altra soluzione, anche se è più farraginosa è la seguente:
    stampi il grafico da solo
    chiudi la stampante
    riapri la stampante
    e stampi le tabelle.
    spero di esserti stato d'aiuto
  • Re: Output di un grafico più grande di A4 su stampante

    Grazie smalldragon , ci provo
  • Re: Output di un grafico più grande di A4 su stampante

    Un saluto a tutti i bit-pal ,
    nonostante il vostro aiuto , non riesco a risolvere questo problema, che peraltro dovrebbe essere già stato risolto da molti. Credo sia abbastanza comune. Ho provato in questo modo :

    public Bitmap FAA;
    public Graphics g;
    FAA = new Bitmap(827, 3000); // più grande del formato A4 supposto 827 x 1169
    g = Graphics.FromImage(FAA);
    public PrintDocument pd;
    pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);

    void pd_PrintPage(object sender, PrintPageEventArgs e) {
    e.Graphics.DrawImage(FAA, new Rectangle(0, 0, FAA.Width, FAA.Height)); }

    come già detto nessun problema : posso vederlo completo in anteprima con scrolling orizzontale e verticale, posso salvarlo su disco in un file .png e rivederlo con programmi tipo GIMP 2 e PAINT
    ma NON riesco a stamparlo ( brother MFC - L27000N ) : ottengo solo una pagina ( il primo formato A4 )
    Ho provato a suddividere il grafico in più sottografici piccoli senza successo : ( ho curato la sola parte verticale )

    void pd_PrintPage(object sender, PrintPageEventArgs e) {
    // e.Graphics.DrawImage(FAA, new Rectangle(0, 0, FAA.Width, FAA.Height));
    GraphicsUnit units = GraphicsUnit.Pixel;
    float w, h; w = FAA.Width; h = PgFatte * 1169
    GraphicsUnit units = GraphicsUnit.Pixel;
    RectangleF srcRect = new RectangleF(0.0F, h, w, 1169);
    e.Graphics.DrawImage(FAA, 0, 0, srcRect, units);
    if (++PgFatte < PgTot) e.HasMorePages = true; else e.HasMorePages = false;

    void Printing(int tp) {
    pd.DefaultPageSettings.PaperSize = new PaperSize("Personalizzata", FAA.Width, FAA.Height);
    PgFatte = 0; PgTot = FAA.Height / 1169 + 1;
    ppd.ShowDialog(); }

    Cosa sbaglio / cosa manca ?? Grazie per l'eventuale interessamento
  • Re: Output di un grafico più grande di A4 su stampante

    Rosmarino ha scritto:


    Cosa sbaglio / cosa manca ?? Grazie per l'eventuale interessamento
    Oltre all'area del forum, sbagli nel continuare a postare il codice senza formattarlo: usa quel tasto </> che si trova sopra il messaggio, altrimenti non si capisce nulla del tuo codice.
  • Re: Output di un grafico più grande di A4 su stampante

    Grazie del suggerimento Alka, non sono esperto nemmeno del Forum . Qual'è l'area giusta del Forum ??
    Come detto ho provato in questo modo :

    	public PrintDocument pd;
    	public PrintPreviewDialog ppd;
    	public Bitmap FAA;					// creata in precedenza
    	public Graphics g;					// creata in precedenza
    	FAA = new Bitmap(827, 3000); 			// più grande del formato A4 supposto 827 x 1169
    	g = Graphics.FromImage(FAA);
    	int PgFatte;
    	int PgTot;
    
    void pd_PrintPage(object sender, PrintPageEventArgs e) {     ..............
    	e.Graphics.DrawImage(FAA, new Rectangle(0, 0, FAA.Width, FAA.Height));   .............. }
    
    void Printing() {   ..............................
    	pd = new PrintDocument(); // classe da usare per inglobare il documento
    	pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
    	ppd = new PrintPreviewDialog();
    	ppd.Document = pd;
    	pd.DefaultPageSettings.PaperSize = new PaperSize("Personalizzata", FAA.Width, FAA.Height);
    	ppd.ShowDialog();   ..................     }
    come già detto nessun problema : posso vederlo completo in anteprima con scrolling orizzontale e verticale, posso salvarlo su disco in un file .png e rivederlo con programmi tipo GIMP 2 e PAINT
    ma NON riesco a stamparlo ( brother MFC - L27000N ) : ottengo solo una pagina ( il primo formato A4 )
    Ho provato a suddividere il grafico in più sottografici piccoli senza successo : ( ho curato la sola parte verticale )
    void pd_PrintPage(object sender, PrintPageEventArgs e) {   ....................
    		// e.Graphics.DrawImage(FAA, new Rectangle(0, 0, FAA.Width, FAA.Height));	// codice sostituito
    	GraphicsUnit units = GraphicsUnit.Pixel;					// nuovo codice
    	float w, h; 										// nuovo codice
    	w = FAA.Width; 									// nuovo codice
    	h = PgFatte * 1169;									// nuovo codice
    	GraphicsUnit units = GraphicsUnit.Pixel;					// nuovo codice
    	RectangleF srcRect = new RectangleF(0.0F, h, w, 1169.0F);		// nuovo codice
    	e.Graphics.DrawImage(FAA, 0, 0, srcRect, units);			// nuovo codice
    	if (++PgFatte < PgTot) e.HasMorePages = true; 				// nuovo codice
    	else e.HasMorePages = false;     ..................  }			// nuovo codice
    
    void Printing() {   ..............................
    	pd.DefaultPageSettings.PaperSize = new PaperSize("Personalizzata", FAA.Width, FAA.Height);
    	PgFatte = 0; 										// nuovo codice
    	PgTot = FAA.Height / 1169 + 1;							// nuovo codice
    	ppd.ShowDialog();   ..................     }
    Cosa sbaglio / cosa manca ?? Grazie per l'eventuale interessamento
  • Re: Output di un grafico più grande di A4 su stampante

    Rosmarino ha scritto:


    Cosa sbaglio / cosa manca ?? Grazie per l'eventuale interessamento
    Hai fatto debugging passo per passo del tuo codice per verificare che i valori e il percorso eseguito dal programma quando richiedi la stampa si comporti esattamente così come hai predeterminato?
  • Re: Output di un grafico più grande di A4 su stampante

    Grazie per la risposta Alka ,
    certo , è la prima cosa che faccio . Può essere che sia stato superficiale : lo rifarò .
    Ma le istruzioni :
    	GraphicsUnit units = GraphicsUnit.Pixel;					// nuovo codice
    	float w, h; 										// nuovo codice
    	w = FAA.Width; 									// nuovo codice
    	h = PgFatte * 1169;									// nuovo codice
    	GraphicsUnit units = GraphicsUnit.Pixel;					// nuovo codice
    	RectangleF srcRect = new RectangleF(0.0F, h, w, 1169.0F);		// nuovo codice
    	e.Graphics.DrawImage(FAA, 0, 0, srcRect, units);			// nuovo codice
    	if (++PgFatte < PgTot) e.HasMorePages = true; 				// nuovo codice
    	else e.HasMorePages = false;     ..................  }			// nuovo codice
    ti sembrano corrette ??
  • Re: Output di un grafico più grande di A4 su stampante

    Rosmarino ha scritto:


    ...
    Ma le istruzioni :
    ...
    ti sembrano corrette ??
    La domanda non trovo abbia senso...
    Se compila, son corrette, no? Che poi facciano quel che ti serve lo scopri facendo i test. Se i test non tornano, fai debug.
  • Re: Output di un grafico più grande di A4 su stampante

    Grazie per l' attenzione Sgrubak ,
    scusa se non uso i termini corretti , sono un ultra dilettante . Programmo per tenere in esercizio la mente .
    La domanda corretta forse è : dato un grafico che viene correttamente ed interamente videato con l' istruzione :
                  e.Graphics.DrawImage(FAA, new Rectangle(0, 0, FAA.Width, FAA.Height));
    essendo tale grafico più grande del foglio A4 , volendolo stampare su carta , dovendolo quindi dividere in grafici più piccoli ,
    le istruzioni :
    	RectangleF srcRect = new RectangleF(0.0F, PgFatte * 1169, FAA.Width, 1169.0F);
    	e.Graphics.DrawImage(FAA, 0, 0, srcRect, units);	
    sono idonee a suddividere il grafico grande ??
    Oppure : ci sono altre istruzioni per dividere un grafico ??
  • Re: Output di un grafico più grande di A4 su stampante

    Rosmarino ha scritto:


    certo , è la prima cosa che faccio . Può essere che sia stato superficiale : lo rifarò .
    Ma le istruzioni :
    [...]
    ti sembrano corrette ??
    Non si tratta di un codice "a titolo esemplificativo", ma di una implementazione completa, con svariate righe di codice, che non ho il tempo di copiare/incollare per cercare di riprodurre il tuo problema e capire se c'è un errore e dove si trova.

    Questo per dire che la validità di ciò che hai scritto la determini solamente eseguendo il codice e verificando cosa avviene a ogni passaggio.

    Ad esempio, prova a lanciare il programma, mettere dei breakpoint sulle istruzioni cruciali (es. quelle che disegnano l'immagine o dove si fa accesso a quello che dovrebbe essere il numero della pagina corrente) e verifica quali valori vengono passati a quelle chiamate.

    Puoi anche in seguito informarci su quello che è il risultato del test, se emerge che a tuo dire i valori sono corretti ma non ottieni il risultato voluto.

    In ogni caso, almeno personalmente non ho il tempo né la possibilità di riscrivere il tuo codice, inventarmi un bitmap, lanciare il programma, e poi magari scoprire che sul mio PC funziona perché c'è un problema nei parametri di ingresso che stai usando o altre problematiche simili.

    In conclusione, testa l'applicazione e verifica cosa succede nei momenti determinanti: se ti sembra tutto corretto, riportaci i risultati e i tuoi dubbi e vediamo come proseguire.

    Ciao!
  • Re: Output di un grafico più grande di A4 su stampante

    Il fatto è che continui a rispondere alla domanda

    Alka ha scritto:


    ...
    Hai fatto debugging passo per passo del tuo codice per verificare che i valori e il percorso eseguito dal programma quando richiedi la stampa si comporti esattamente così come hai predeterminato?
    Con un'altra domanda. Apparentemente le istruzioni che hai scritto dovrebbero parzializzare l'immagine su più fogli, ma se non funziona, non riusciamo a dirtelo noi. Se hai altro codice che cambia le variabili in gioco, noi non lo possiamo sapere. Quindi la domanda di alka, resta:
    In debug, una riga alla volta e fino alla fine della stampa di tutti i fogli, le variabili hanno i valori che ti aspetti?
Devi accedere o registrarti per scrivere nel forum
21 risposte