Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

[WPF] Un petit lecteur de XPS

Après une soirée à coder, voici ma première petite application WPF. En utilisant le control WPFControlBook que Mitsu avait développé (ici) j'ai créé un petit lecteur de fichiers XPS. Le document XPS est ouvert et on peut le lire en tournant les pages à la souris. Voici une capture d'écran pour illustrer un peu mieux c'est que j'ai essayé de faire :

Pour réaliser cela, il suffit simplement de déposer le control Book (WPFBookControl) dans la form pour pouvoir s'en servir.

Ensuite il restait à résoudre le problème du lecteur XPS, il existe un control DocumentViewer qui permet de lire un document XPS, mais je voulais pouvoir traiter chaque page séparement afin de pouvoir les associer au control Book. Pour cela, j'ai inclus un petit morceau de code trouvé sur le forum MSDN US (ici) qui permet de générer chaque page du fichier XPS en fichier BMP :

public void SaveXpsPageToBitmap(string xpsFileName)
{
   XpsDocument xpsDoc = new XpsDocument(xpsFileName, System.IO.FileAccess.Read);
   FixedDocumentSequence docSeq = xpsDoc.GetFixedDocumentSequence();

   int pageCount = docSeq.References[0].GetDocument(false).Pages.Count;

   for (int pageNum = 0; pageNum < pageCount; pageNum++)
   {
      DocumentPage docPage = docSeq.DocumentPaginator.GetPage(pageNum);
      BitmapImage bitmap = new BitmapImage();
      RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)docPage.Size.Width,
                                            (int)docPage.Size.Height,96,96,
                                            System.Windows.Media.PixelFormats.Pbgra32);
      renderTarget.Render(docPage.Visual);

      BitmapEncoder encoder = new BmpBitmapEncoder();
      encoder.Frames.Add(BitmapFrame.Create(renderTarget));

      FileStream pageOutStream = new FileStream(xpsFileName + ".Page" + pageNum + ".bmp", FileMode.Create, FileAccess.Write);
      encoder.Save(pageOutStream);
      pageOutStream.Close();
   }
}

J'ai ensuite créé un user control UCBitmap qui permet d'afficher un Bitmap dans un control Image.

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
   Stream imageStream = new FileStream(source, FileMode.Open, FileAccess.Read, FileShare.Read);
   BitmapImage myImageStream = new BitmapImage();
   myImageStream.BeginInit();
   myImageStream.StreamSource = imageStream;
   myImageStream.EndInit();
   imagePage.Source = myImageStream;
}

Et avec une boucle permettant de passer chaque page du document XPS, je récupère le fichier Bitmap généré plus tôt et je l'affiche dans une instance de mon user control UCBitmap que j'associe ensuite au control Book de ma form principale, tout cela lorsque l'application est chargée.

private void Window_Loaded(object sender, RoutedEventArgs e)
{
   object itemPage;

   SaveXpsPageToBitmap(FileName);

   for (int i = 0; i < pageCount; i++)
   {
      string source = FileName + ".Page" + i + ".bmp";
      UCBitmap bt = new UCBitmap(source);

      itemPage = (object)bt;
      myBook.Items.Add(itemPage);
   }
}

Et enfin lorsque l'application est lancée, le fichier XPS s'affiche et grâce à la souris, on peut facilement feuilleter ce document XPS Smile  

Lecteur XPS 2

 

 

 

 

 

 

 

 

 

 

 

Ce code n'est pas spécialement optimisé, il est le fruit de mes recherches d'une soirée. Tous les commentaires sont les bienvenus Wink

Ces bouts de codes sont les prémices d'une application un peu plus compléte que je souhaite réaliser en WPF et qui fera l'objet de plusieurs posts d'ici quelques temps.

Publié dimanche 18 mai 2008 19:27 par Audrey
Classé sous : ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: [WPF] Un petit lecteur de XPS

Ca me fait penser à ce que j'ai fait pour un certain Laurent bien connu des communautais (il se reconnaitra ;) mais beau travail Audrey :)

dimanche 18 mai 2008 22:46 by Thomas LEBRUN

# re: [WPF] Un petit lecteur de XPS

Thomas: Effectivement ;)

lundi 19 mai 2008 08:12 by laurentkempe

# re: [WPF] Un petit lecteur de XPS

Cool Audrey, c'était le step 1, maintenant, j'attend impatiemment la suite ;-)

lundi 19 mai 2008 10:02 by Matthieu MEZIL

# re: [WPF] Un petit lecteur de XPS

Super sympa! J'ai un peu galéré sur le MSDN pour arriver jusqu'ici mais ça valait le coup!

vendredi 23 mai 2008 11:40 by radric
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Accès anonyme et les pages Forms / viewlsts.aspx... par Nicolas Humann le il y a 3 heures et 52 minutes

- l'Atelier 4 du coach C# est disponible par Bernard Fedotoff le il y a 5 heures et 28 minutes

- [WPF] Formatter l’affichage lors d’un binding, via StringFormat par Thomas Lebrun le il y a 10 heures et 30 minutes

- WSC08 : Le bilan, Les Photos, Les Webcasts à voir ou à revoir par Blog de Daniel TIZON [daniel] le il y a 19 heures et 37 minutes

- SharePoint et ses DB : Avez vous pensé à les "Tweaker" ? par The Mit's Blog le il y a 20 heures et 6 minutes

- NTttcp : Mesurer la vitesse d'un réseau par Blog d'Olivier Huet le il y a 20 heures et 31 minutes

- Un nouveau quizz par Matthieu MEZIL le il y a 23 heures et 15 minutes

- Webcast ADO.NET Data Services par Matthieu MEZIL le il y a 23 heures et 18 minutes

- edmx : mise à jour du modèle depuis la base par Matthieu MEZIL le 10-06-2008, 17:47

- Alternatif - Mono 2.0 est arrivé! par #Rui le 10-06-2008, 16:33