4 pagine in totale: <<Indietro 1 2 [3] 4 Avanti >>
Creazione di documenti XPS
Oltre all'utilizzo del driver di stampa XPS per noi sviluppatori sono dedicate delle librerie di sviluppo. XPS infatti si basa fortemente sul .NET Framework 3.0, in particolare su Windows Presentation Foundation, e in quest'ultimo sono presenti una serie di API, contenute nel namespace System.Windows.Documents, rivolte per la gestione documentale. In realtà il contenuto XML delle FixedPage è proprio la serializzazione in XAML di una classe FixedPage e perciò mediante questo framework, la creazione di documenti risulta essere molto banale. In WPF esistono due categorie di documenti: fixed e flow. La prima rispecchia le caratteristiche dei documenti WYSIWYG, mentre la seconda rappresenta documenti che variano il loro layout in funzione dell'ambiente in cui si trovano, in modo simile alle pagine HTML. In questo articolo non affrontiamo in dettaglio la parte documentale, ma ci limitiamo a persistere o stampare un documento già "pronto".
Come abbiamo già detto, per package intendiamo in modo generale l'impacchettamento di dati. Perciò anche nel .NET Framework 3.0 la classe Package del namespace System.IO.Packaging rappresenta questo concetto e permette di aprire e sfogliare qualsiasi pacchetto, anche un file di Office 2007:
using (Package package = Package.Open("End User.xps", FileMode.Open, FileAccess.ReadWrite))
{
foreach (PackagePart part in package.GetParts())
{
Console.WriteLine("{0}: {1}", part.Uri, part.ContentType);
}
}Nello specifico, invece, un documento XPS è rappresentato dalla classe XpsDocument del namespace System.Windows.Xps.Packaging e permette le operazioni più comuni come la lettura, l'apporto e la verifica di una firma digitale. Mediante poi la classe XpsDocumentWriter, creata in funzione di un documento, abbiamo lo strumento per la scrittura di un documento XPS:
// Creo il documento XPS sul file temporaneo
using (XpsDocument document = new XpsDocument(filename, System.IO.FileAccess.Write))
{
// Creo il writer in funzione del documento XPS
XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(document);
// Scrivo tutto il FlowDocument contenuta nella RichTextBox
IDocumentPaginatorSource paginator = ((IDocumentPaginatorSource)this.body.Document);
writer.Write(paginator.DocumentPaginator);
}Nell'esempio, abbiamo utilizzato il FlowDocument generato da una RichTextBox, una casella di testo che permette di editare FlowDocument all'interno di un'applicazione WPF, come elemento da serializzare passandolo al metodo Write. Questo metodo a molti overloads che permettono di serializzare Visual (qualsiasi elemento visuale di WPF), FixedDocument (un documento), FixedPage (una pagina) e DocumentPaginator (classe che gestisce la paginazione di un documento). Possiamo inoltre serializzare in modo asincrono con il metodo WriteAsync e non bloccare così l'applicazione. Chiamando tale metodo inoltre si scatenano una serie di eventi che la classe XpsDocumentWriter possiede come WritingProgressChanged, WritingCompleted e WritingCancelled. Poiché possiamo ottenere la classe XpsDocumentWriter anche da un pool di stampa, mediante il metodo Async possiamo generare una stampa senza interfenire con l'applicazione, in modo asincrono, cosa che con GDI non possiamo fare.
L'uso di XpsDocument è molto semplice, ma non offre un controllo completo sul documento XPS da generare. La classe XpsSerializationManager del namespace System.Windows.Xps.Serialization permette di controllare anche alcuni aspetti come la gestione della memorizzazione delle part e dei font.
Possiamo infatti decidere tramite la classe XpsPackagingPolicy come distribuire le part all'interno del pacchetto agendo sull'enumerazione PackageInterleavingOrder che supporta queste metodologie:
- None: nessuna politica di impacchettamento viene applicata;
- ResourceFirst: immagini e font sono lette prima del testo;
- ResourceLast: immagini e font sono lette dopo il testo;
- ImagesLast: le immagini sono lette per ultime, precedute da testo e font.
La modifica di questa policy può influire sulla stampa e sul viewer, perché possiamo scegliere se permettere di visualizzare il testo anche se le immagini o i font non sono stati caricati.
// Creo la policy
XpsPackagingPolicy policy = new XpsPackagingPolicy(document, PackageInterleavingOrder.ImagesLast);
// Creo il serializzatore sulla base della policy
XpsSerializationManager writer = new XpsSerializationManager(policy);
// Serializzo il FlowDocument
writer.SaveAsXaml(paginator.DocumentPaginator);4 pagine in totale: <<Indietro 1 2 [3] 4 Avanti >>
Contenuti dell'articolo
- Pagina 1
- Pagina 2
- Pagina 3
- Pagina 4
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.








Difficoltà
Utilità
Stampa
Download 


10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!
