2009-07-24 10 views
5

Uso il percorso di stampa WPF per gestire diagrammi di grandi dimensioni creati nella nostra applicazione. L'intero diagramma è costituito da elementi visivi.Il salvataggio e la stampa di XPSDocument tramite Paginator (sembra) causa una rasterizzazione del contenuto

Un cosiddetto "DesignerPaginator" impagina il diagramma (è piuttosto semplice). Da questo punto, faccio le seguenti tre cose: - Stampo il documento con PrintDialog.PrintDocument (Paginator, Title) - Creo anche un documento XPS con XpsDocumentWriter.Write (Paginator, PrintTicket); che risparmio sul disco rigido - Dal XpsDocument assegno XpsDocumentWriter.GetFixedDocumentSequence() per un DocumentViewer

In poche parole, seguente codice è importante:

PrintDialog _pdialog = new PrintDialog(); 
System.Printing.ValidationResult result = this.PrintQueue.MergeAndValidatePrintTicket(this.PrintQueue.UserPrintTicket, this.PrintTicket); 

_pdialog.PrintTicket = result.ValidatedPrintTicket; 
XpsDocument _xpsDocument = new XpsDocument("C:\\test.xps",FileAccess.ReadWrite); 
XpsDocumentWriter xpsdw = XpsDocument.CreateXpsDocumentWriter(_xpsDocument); 
xpsdw.Write(this.Paginator, result.ValidatedPrintTicket); 
documentviewer.Document = _xpsDocument.GetFixedDocumentSequence(); 
_xpsDocument.Close(); 

_pdialog.PrintQueue = this.PrintQueue; 
_pdialog.PrintDocument(this.Paginator, "Model Test"); 

L'output è la seguente:

XPS su HDD -> assolutamente sfocato. Non puoi riconoscere nulla. È come un file GIF con uno zoom 100x. FixedDocumentSequence da XPSDocument in DocumentViewer -> Perfect. Questo dovrebbe essere il significato del file XPS Stampa output -> Orribile, sfocato, ma almeno molto meglio del file xps

E ora la parte misteriosa: se stampo direttamente dal DocumentViewer (in cui il FixedDocumentSequence sembra perfetto), ottengo lo stesso output sfocato dalla prima stampa.

Il mio pensiero su questo caso è che il sistema XPS di WPF rasterizza il contenuto e posiziona le cose come bitmap di bassa qualità all'interno del documento xps. Sono tutti i vettori, e nonostante questo l'output sembra sempre familiare a una bitmap a bassa risoluzione.

Apprezzerei qualsiasi aiuto. Sono fuori di idee. Ho provato molto a eseguire il debug di questo problema, ma in qualche modo sembra essere qualcosa di semplice e delicato allo stesso tempo.

+0

Anch'io ho combattuto la rasterizzazione come un matto. niente affatto divertente. –

risposta

4

Ho scoperto come evitare il mio problema, ma non posso garantire che la soluzione si applichi anche al tuo. In effetti, sembra che utilizzando due VisualBrush nidificati proiettati sul Visual si stiano utilizzando risultati nell'output sfocato.

Un VisualBrush che usiamo nella stampa wpf non può essere evitato: è quello che viene applicato tramite il nostro Paginator per tagliare il Visual e distribuirlo su più pagine. Avevo anche un UserControl che fungeva da "Modello". Disegno un rettangolo con il VisualBrush del nostro diagramma in UserControl e, dopo questa operazione, lo stesso UserControl si disegna come Rectangle con un VisualBrush sulle pagine del paginator. Poiché il percorso di stampa di WPF utilizza XPS per la stampa, è anche possibile creare un XPSDocument, modificare il tipo di file in zip, estrarlo e analizzare una pagina del documento con qualsiasi editor di testo. Questo ti aiuterà molto a capire il tuo problema.

Ho anche il sospetto che il documento sia "rasterizzato" quando il contenuto di VisualBrush non viene applicato con il rapporto altezza/larghezza 1: 1 originale di Visual. Gli errori all'interno di un calcolo di ridimensionamento hanno portato a un rapporto altezza/larghezza 1: 0.9948 per il VisualBrush applicato, e questo ha portato a un output sfocato (escluso il problema "nested VisualBrush").

Questo è ancora solo un sospetto. Il mio problema è stato risolto escludendo il VisualBrush "extra" e rispettando le proporzioni originali. È anche possibile ipotizzare che uno/o entrambi i problemi compaiano solo in combinazione con una certa Visione/Effetto/Trasformazione o anche LinearBrush.

Almeno, ho imparato una cosa sul percorso di stampa WPF quando si tratta di questi problemi: pensate al fatto che i vostri file vengono sempre convertiti in xps dietro la scena, e xps è simile a wpf, ma non lo fa supporta tutto ciò che fa wpf. In effetti, se non l'avessi capito male, XPS è stato l'ispirazione per XAML in WPF.

Sarebbe anche molto gradito qualsiasi risposta reale a questo problema. Il mio problema è risolto, ma voglio sapere perché è successo.

+0

Mi piacerebbe scoprire come eseguire il debug di queste situazioni e non dover ricorrere a tentativi ed errori. (che sta semplicemente riaffermando il tuo "Id come una vera risposta"). –

Problemi correlati