2011-09-18 11 views
6

trato de imprimir el contenido de mi editor:de intervalo de páginas en problemas al imprimir un documento

PrintDialog pd = new PrintDialog(); 

pd.PageRangeSelection = PageRangeSelection.AllPages; 
pd.UserPageRangeEnabled = true; 

FlowDocument fd = DocumentPrinter.CreateFlowDocumentForEditor(CurrentDocument.Editor); 
DocumentPaginator dp = ((IDocumentPaginatorSource)fd).DocumentPaginator; 

bool? res = pd.ShowDialog(); 

if (res.HasValue && res.Value) 
{ 
    fd.PageHeight = pd.PrintableAreaHeight; 
    fd.PageWidth = pd.PrintableAreaWidth; 
    fd.PagePadding = new Thickness(50); 
    fd.ColumnGap = 0; 
    fd.ColumnWidth = pd.PrintableAreaWidth; 

    pd.PrintDocument(dp, CurrentDocument.Editor.FileName); 
} 

El documento de prueba-i utilizado tiene cerca de 14 páginas (con este PAGESIZE-settings). lo probé: aparece el cuadro de diálogo Imprimir y he elegido un rango de páginas (he escrito "1-3" en el cuadro de texto) y he hecho clic en print. sobre el printdocument() establecí un punto de interrupción y busqué en printdialog-object. dice pd.PageRangeSelection = PageRangeSelection.UserPage y pd.PageRange = {1-3}. Supongo que esto es correcto, porque quería imprimir solo la página 1-3. luego, el printdocument() ejecutado y en el output-pdf (para probar el uso de una impresora pdf) tiene 14 páginas (se imprimió el documento completo).

¿Dónde está mi error? ¿Por qué la configuración de paginación no funciona?

gracias por su ayuda

Respuesta

0

En su código establece manualmente:

pd.PageRangeSelection = PageRangeSelection.AllPages; 

Esta es la razón por su código imprime todas las páginas.

+0

esta no es la razón. Ya dije que lo he depurado y que PageRangeSelection-Property está configurado en UserPages antes de que se ejecute PrintDocument() - Método – 0xDEADBEEF

1

La razón de esto es porque FlowDocument 's DocumentPaginator no maneja UserPageRange s. Puede ver que la implementación FlowDocument crea un FlowDocumentPaginator y no tiene en cuenta los rangos.

Si lo manejara, en FlowDocumentPaginator.(Async)GetPage, verificaría el código para ver si la página solicitada para ser impresa está en un índice de páginas disponibles; o tal vez si existe una clave en un Dictionary cuyo valor es el DocumentPage para imprimir.

En otras palabras, y la razón por defecto PrintDialog ha establecido UserPageRangeEnabled a false, se debe a que con el fin de utilizar esta funcionalidad, por lo general tendrá que escribir su propio DocumentPaginator o tiene que añadir un poco de lógica para compilar un nuevo documento temporal para contener solo las páginas que desea imprimir.

No dude en hacer cualquier pregunta.

Cuestiones relacionadas