2014-07-08 19 views
7

Questo è in qualche modo simile a mettere in discussione su Is there a better way to get the page count from a PrintDocument than this?Get numero di pagine di stampa senza stampare il documento

Ma nel mio caso ho un controllo web-browser con HTML formattato. Al momento ho un'opzione che chiama ShowPrintPreviewDialog() così l'utente può vedere quante pagine devono essere stampate.

Esiste comunque il numero di pagine che verranno stampate senza avviare lo PrintPreview?

Sto provando a creare un metodo che chiamerà OnTextChange e visualizzerà automaticamente il conteggio delle pagine di stampa?

devo usare PrintPage evento

private void PrintDocumentOnPrintPage(object sender, PrintPageEventArgs e) 
{ 
    e.Graphics.DrawString(this.webBrowser1.DocumentText, this.webBrowser1.Font, Brushes.Black, 10, 25);    
} 
+0

Penso che tu abbia la tua risposta nella [risposta alla domanda collegata] (http://stackoverflow.com/a/11456713/1552016): è un metodo statico che puoi chiamare nel gestore dell'evento di modifica del testo, e non visualizzerà alcuna finestra di dialogo. – qqbenq

+0

@qqbenq: se si usa 'StandardPrintController' funziona bene ma non' PreviewPrintController', quindi la risposta non aiuta –

risposta

10

cattive notizie viaggiano sempre lento a SO. Avrai bisogno di scalfire l'idea che sia pratico.

Anche se non dichiarato nella domanda, dovresti aver già capito che il tuo gestore di eventi PrintPage non funziona. Produce sempre un conteggio di 1. Questo perché non si imposta mai la proprietà e.HasMorePages su true, la proprietà che causa la generazione di più di una pagina.

A in modo affidabile impostare tale proprietà su true, è necessario capire esattamente come l'HTML viene visualizzato dal motore di layout del browser. E scopri esattamente come suddividerlo in pagine che non tagliano, diciamo, una riga di testo o un'immagine in due. E scopri come farlo nello esatto nello stesso modo in cui lo fa il motore di stampa del browser. Un'impresa che è stata tentata da molti programmatori, compiuta da nessuno. Il modello di oggetti di automazione del browser non ha l'API necessaria.

L'unico modo ragionevole è quello che già conosci. È avere per chiamare ShowPrintPreviewDialog(). Che visualizza immediatamente il numero di pagine nella finestra di anteprima, si presenta come questo in IE11:

enter image description here

Nel caso in cui piacerebbe prendere in considerazione snooping quel numero al largo della finestra di dialogo: no, che non può funzionare. La finestra di dialogo non usa alcun controllo, è una finestra monolitica.

+0

Salve, dove imposto realmente 'e.NewPage'. Non riesco a trovare proprietà simili? –

+0

Quello era un errore di battitura, corretto. Si prega di provare a ingannare il punto della risposta, non hai la possibilità di impostarlo correttamente. –