2011-11-22 16 views
8

I have a System.Window.Controls.PrintDialog e voglio stampare le pagine con modalità orizzontale e verticale con un singolo PrintTicket ma a quanto pare posso solo impostare l'orientamento una volta.PrintDialog with Landscape and Portrait pages

Finché voglio stampare su carta questo potrebbe non essere un grosso problema ma voglio stampare/creare un documento PDF dal mio Printjob. Lì ho bisogno di pagine con la modalità Orizzontale e Verticale nel documento onc.

Finora sono riuscito a ruotare le pagine panoramiche di 90 gradi e questo funziona bene ma nel PrintPreview sembra molto strano a causa del contenuto ruotato.

+1

Hai mai trovato un modo per farlo? Mi piacerebbe essere in grado di farlo per gli stessi motivi (stampando su PDF con pagine miste di ritratto/paesaggio) e non ho trovato il modo di farlo funzionare. – markmuetz

+1

Non una risposta, ma ha funzionato in un progetto dove necessario anche quello. Dopo giorni di ricerche ho finito per fare lo stesso di te. Tuttavia, un documento XPS è in grado di correggere l'orientamento della carta (come mostrato durante l'esportazione da MS Word a XPS). Sto ancora aspettando di vedere come è fatto. – NestorArturo

risposta

1

Non è pulito come vorresti e più di una soluzione alternativa, ma penso che potrebbe raggiungere il tuo obiettivo. È possibile utilizzare la libreria iTextSharp per concatenare i PDF in uno dei seguenti processi di stampa multipli. Ecco alcuni sample code.

Speriamo che qualcuno abbia una soluzione più semplice.

1

Molto tempo dopo ...

È possibile farlo fornendo un EventHandler che viene chiamato chiedendo il PrintTicket personalizzato, prima di ogni pagina viene stampata. Il PageViewModel qui efficacemente 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(); 
    } 

e bingo! Ritratto e paesaggio misti. Anche in fronte-retro va bene.

Problemi correlati