2011-11-22 35 views
8

Tengo System.Window.Controls.PrintDialog y quiero imprimir páginas con modo horizontal y modo vertical con Single PrintTicket, pero parece que solo puedo establecer la orientación una vez.PrintDialog con páginas Horizontal y Vertical

Mientras quiera imprimir en papel esto puede no ser un gran problema pero quiero imprimir/crear un documento PDF desde mi Printjob. Ahí necesito páginas con el modo Paisaje y Retrato en el documento original.

Hasta ahora logré rotar las páginas de paisaje 90 grados y esto funciona bien, pero en PrintPreview parece muy extraño debido al contenido girado.

+1

¿Alguna vez encontró una forma de hacer esto? Me gustaría poder hacerlo por las mismas razones (impresión en PDF con páginas mixtas de retrato/paisaje) y no he encontrado la manera de hacerlo funcionar. – markmuetz

+1

No fue una respuesta, pero funcionó en un proyecto donde también era necesario. Después de días de investigación, terminé haciendo lo mismo que tú. Sin embargo, un documento XPS es capaz de corregir la orientación del papel (como se ve al exportar desde MS Word a XPS). Todavía estoy esperando ver cómo se hace. – NestorArturo

Respuesta

1

No es tan limpio como quisieras y es más una solución, pero creo que podría lograr tu objetivo. Puede usar la biblioteca iTextSharp para concatenar archivos PDF en uno después de varios trabajos de impresión. Aquí hay algunos sample code.

Esperemos que a alguien se le ocurra una solución más directa.

1

Mucho tiempo después ...

Puede hacer esto proporcionando un manejador de sucesos que es llamada, pidiendo una PrintTicket costumbre, antes de imprimir cada página. El PageViewModel aquí efectivamente comprende

PageViewModel{ 
    Page Page {get;set;} 
    PageOrientation? PageOrientation {get;set} 
} 

if (PrintDialog.ShowDialog() == true) 
    { 
    XpsDocumentWriter xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(PrintDialog.PrintQueue); 
    xpsDocumentWriter.WritingPrintTicketRequired += (s, e) => 
    { 
     PageViewModel pVM = publicationVM.Pages[e.Sequence - 1]; 
     if (pVM.Orientation != null && pVM.Orientation != publicationVM.Orientation) 
     { 
     e.CurrentPrintTicket = new PrintTicket(); 
     e.CurrentPrintTicket.PageOrientation = PageOrientation.Portrait; 
     } 
    }; 
    VisualsToXpsDocument visualsToXpsDocument = (VisualsToXpsDocument) xpsDocumentWriter.CreateVisualsCollator(PrintDialog.PrintTicket, PrintDialog.PrintTicket); 
    visualsToXpsDocument.BeginBatchWrite(); 
    Page page; 
    foreach (PageViewModel pVM in publicationVM.Pages) 
    { 
     page = pVM.Page; 
     visualsToXpsDocument.Write(page); 
    } 
    visualsToXpsDocument.EndBatchWrite(); 
    } 

y bingo! Retrato y paisaje mixto. Duplexar esto también está bien.

Cuestiones relacionadas