septembre
2011
Maintenant que la version RC de Silverlight 5 est disponible au téléchargement, il est temps de se pencher sur les principales nouveautés proposées. Nous commençons notre tour d’horizon aujourd’hui avec l’impression vectorielle. Cette fonctionnalité, très utile dans le cadre d’une application d’entreprise par exemple, a été longtemps réclamée par les développeurs.
Pour l’histoire, signalons que Silverlight 4 introduisait déjà une fonctionnalité d’impression au format bitmap. Même si il était appréciable de pouvoir enfin imprimer facilement, il faut avouer que ce n’était pas encore la panacée. En effet, l’impression bitmap posait de nombreux problèmes, surtout lorsqu’on souhaitait imprimer plusieurs pages. En effet, Silverlight 4 envoyait à l’imprimante un fichier bitmap particulièrement lourd. En résumé, l’impression bitmap était plus une ébauche qu’une véritable solution utilisable en entreprise.
Heureusement, Silverlight 5 arrive !
Avec cette nouvelle version, nous disposons enfin d’une impression vectorielle bien plus puissante, rapide et légère. Voyons ensemble comment utiliser cette fonctionnalité.
PrintDocument
Si vous avez déjà utilisé l’impression bitmap sous Silverlight 4, vous serez en terrain connu. En effet, on utilise toujours la classe PrintDocument qui se trouve dans l’espace de nom System.Windows.Printing.
Si on regarde un peu ce que propose cette classe PrintDocument, on y trouve 3 évènements :
- BeginPrint qui est déclenché juste avant le lancement de l’impression.
- PrintPage qui est déclenché au moment de l’impression de chaque page et qui permet de définir ce qui doit être imprimé.
- EndPrint qui est déclenché à la fin de l’impression.
Généralement, BeginPrint est utilisé pour paramétrer l’impression.
Pour réaliser notre première tentative d’impression, nous allons donc nous abonner sur l’évènement PrintPage et définir ce que l’on souhaite imprimer :
doc.PrintPage += (s, args) =>
{
// Quand une page est imprimée
args.PageVisual = printPanel;
args.HasMorePages = false;
};
Nous utilisons pour cela la propriété PageVisual sur laquelle nous devons placer un UIElement. En l’occurrence, nous lui plaçons un StackPanel défini dans notre UI. Nous précisons ensuite qu’il n’y aura pas plus de pages grâce à la propriété HasMorePages. Dans le cas ou HasMorePages est à true, la page est imprimée et PrintPage est à nouveau appelé pour imprimer la seconde page.
Pour finir notre premier exemple, il suffit de lancer l’impression avec la méthode Print qui attend en paramètre le nom du document au format string.
doc.Print("Mon premier document");
L’appel de la méthode Print démarre le processus d’impression et provoque l’affichage d’une fenêtre permettant à l’utilisateur de sélectionner son imprimante.
C’est lorsque l’utilisateur a choisi son imprimante que l’événement BeginPrint est déclenché.
Si vous avez reproduit ce code, vous avez peut être remarqué que la méthode Print avait une surcharge prenant 3 paramètres. En plus du nom du document, il est en effet possible de préciser certaines préférences d’impression.
On doit pour cela utiliser la nouvelle classe PrinterFallBackSetting :
var settings = new PrinterFallbackSettings();
Notre objet settings ne possède que 2 propriétés :
- ForceVector qui attend un booléen et qui permet de forcer l’impression en mode vectoriel.
- OpacityThreshold qui attend un double et qui permet de spécifier l’opacité minimale à prendre en compte
Bien sûr, vous vous demandez surement pourquoi est-il possible de forcer l’impression en mode vectoriel. En fait, l’impression par défaut que nous avons vu précédemment peut parfois basculer en mode bitmap. Cela arrive quand des éléments à imprimer ont des caractéristiques que PostScript ne comprend pas. Par exemple, si un élément a une opacité différente de 1 (valeur par défaut), l’impression se fera en Bitmap.
Modifions le code précédent en ajoutant un élément visuel avec une opacité à 0.5 (un rectangle bleu dans notre exemple). A l’exécution, vous ne remarquerez aucune différence mais en réalité, l’impression s’est faite automatiquement en mode bitmap.
En forçant l’utilisation du mode vectoriel, Silverlight imprimera dans ce mode, même si des éléments incompatibles avec PostScript existent. Signalons que cela ne fonctionne que si votre imprimante prend en charge l’impression PostScript. Dans le cas contraire, l’impression se fera dans tous les cas en mode Bitmap (même si vous passez la propriété ForceVector à true).
Terminons notre deuxième exemple :
"Mon deuxième document",
settings,
false);
Cette fois, notre impression s’est bien fais en vectorielle. Cependant, on constate que l’élément dont l’opacité était à 0.5 apparait totalement opaque sur notre impression.
Comme nous l’avons vu, PostScript ne prend pas en charge cette fonctionnalité. En complément de la propriété ForceVector, notre objet settings propose donc une seconde propriété appelée OpacityThreshold. Elle permet d’indiquer l’opacité à partir de laquelle les éléments à imprimer doivent être pris en compte. Par défaut, la valeur d’OpacityThreshold est 0. Si on indique 0.4, notre rectangle bleu apparaitra toujours avec une opacité de 1. Si par contre on indique 0.5 ou plus, notre rectangle bleu ne sera plus imprimé.
Enfin, signalons que la méthode Print accepte un 3ème paramètre, de type booléen, qui permet de préciser si l’imprimante par défaut doit être utilisée. Dans ce cas, la fenêtre permettant de choisir son imprimante ne sera pas affichée. Cette fonctionnalité ne fonctionne que pour les applications « trusted ».
Voici un petit résumé du comportement de l’impression :
- Imprimante ne prenant pas en charge l’impression PostScript :
- Impression Bitmap dans tous les cas (même si ForceVector est à true).
- Imprimante prenant en charge l’impression PostScript :
- Si des éléments sont incompatibles avec PostScript :
- Print : Impression en bitmap optimisé.
- Print avec forçage : Impression en vectoriel.
- Tous les éléments à imprimer sont compatibles avec PostScript :
- Dans tous les cas, l’impression se fait en vectorielle.
- Si des éléments sont incompatibles avec PostScript :
Impression Bitmap
Vous avez toujours la possibilité d’imprimer par défaut en mode Bitmap en utilisant la méthode PrintBitmap au lieu de Print. Dans ce cas, Silverlight n’aura pas à se poser de question et imprimera directement en Bitmap. Signalons qu’en utilisant cette méthode, les fichiers envoyés à l’imprimante sont particulièrement lourds (plus de 100 Mo). A titre de comparaison, les données envoyées dans le cas d’une impression vectorielle pèsent moins de 3 ko dans notre exemple.
Dans le prochain billet, nous verrons comment utiliser le contrôle PivotViewer qui vient d’être intégré à Silverlight.