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

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01