Rileva quando un PrintDocument stampa correttamente (non solo in anteprima)

Sto facendo un po ‘di stampa personalizzata usando un PrintDocument nella mia applicazione. Ho bisogno di loggarmi quando i nostri articoli sono stampati con successo. Inizialmente l’ho raggiunto con qualcosa di simile:

print_doc.EndPrint += (o,e) => printed_callback (); 

Per far richiamare il mio printed_callback termine di una stampa. Tuttavia, ora che sto aggiungendo il supporto per l’anteprima, sto passando un PrintDocument costruito esattamente nello stesso modo in un PrintPreviewDialog . In questo modo, l’evento EndPrint viene richiamato dopo il rendering iniziale della stampa necessaria per l’anteprima.

Di conseguenza, anche se un utente fa clic su “Anteprima” e quindi chiude l’anteprima, viene richiamato il nostro codice di registrazione.

Qualche suggerimento su come distinguere tra una stampa reale e una “stampa di anteprima”? Sfortunatamente, non posso semplicemente collegarmi a EndPrint per PrintDocument passato a PrintPreviewDialog poiché l’utente potrebbe fare clic sul pulsante “Stampa” nella finestra di anteprima e triggersre una stampa.

Ok, quindi sono riuscito a capirlo da solo, usando la proprietà PrintDocument.PrintController e controllando la proprietà IsPreview del controller. Il mio codice finale è finito come segue:

 doc.EndPrint += (o,e) => { if (doc.PrintController.IsPreview) return; print_callback (); } 

Anche io sono riuscito a capire un modo diverso che ha funzionato per me …

Ho avuto un elenco di classi MyPrintFileDetail contenenti ciascuna un PrintDocument e uno StreamReader per detto documento.

Durante l’installazione del mio PrintDocument, ho aggiunto un evento PrintPage. Nel gestore di eventi PrintPage ho identificato il PrintDocument con cui stavo lavorando, trasmettendo il “mittente” a un PrintDocument. Quindi ha scritto un ciclo foreach per identificare l’object MyPrintFileDetail funzionante dall’elenco per ottenere lo StreamReader che stavo usando per stampare. Una volta che non c’erano più righe da stampare, ho eliminato StreamReader e lo ho impostato su null.

Quindi, all’interno della mia richiamata Timer per elaborare l’elenco degli oggetti MyPrintFileDetail, ho controllato lo StreamReader per null e, se nullo, ho finito di stampare.

Tipo di goffo ma ha funzionato.

  private void PD_PrintPage(object sender, PrintPageEventArgs e) { PrintDocument p = (PrintDocument)sender; PrintFileDetail pfdWorkingOn = null; foreach (PrintFileDetail pfd in pfds) { if (pfd._PrintDoc.DocumentName == p.DocumentName) { pfdWorkingOn = pfd; break; } } float yPos = 0f; int count = 0; float leftMargin = e.MarginBounds.Left; float topMargin = e.MarginBounds.Top; string line = null; float linesPerPage = e.MarginBounds.Height / _TextFilePrintingFont.GetHeight(e.Graphics); while (count < linesPerPage) { line = pfdWorkingOn._TxtFileBeingPrinted.ReadLine(); if (line == null) { break; } yPos = topMargin + count * _TextFilePrintingFont.GetHeight(e.Graphics); e.Graphics.DrawString(line, _TextFilePrintingFont, Brushes.Black, leftMargin, yPos, new StringFormat()); count++; } if (line != null) { e.HasMorePages = true; } else { pfdWorkingOn._TxtFileBeingPrinted.Dispose(); pfdWorkingOn._TxtFileBeingPrinted = null; } }