Publié dimanche 18 mai 2008 19:27 par Audrey

[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.

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 :

Classé sous , ,

# re: [WPF] Un petit lecteur de XPS @ dimanche 18 mai 2008 22:46

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

Thomas LEBRUN

# re: [WPF] Un petit lecteur de XPS @ lundi 19 mai 2008 08:12

Thomas: Effectivement ;)

laurentkempe

# re: [WPF] Un petit lecteur de XPS @ lundi 19 mai 2008 10:02

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

Matthieu MEZIL

# re: [WPF] Un petit lecteur de XPS @ vendredi 23 mai 2008 11:40

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

radric


Les 10 derniers blogs postés

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le il y a 20 heures et 27 minutes

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le il y a 23 heures et 1 minutes

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59

- Perspective 3.0 pour Silverlight 5.0 par Perspective le 02-07-2012, 22:39