Click here to Skip to main content
15,861,125 members
Articles / Programming Languages / C#

Show thumbnails of XPS documents

Rate me:
Please Sign up or sign in to vote.
5.00/5 (8 votes)
26 Jan 2010CPOL1 min read 42.6K   1.9K   40   5
How to show thumbnails of XPS documents.

XPSThumb2.jpg

Introduction

This application was designed as a proof of concept for generating thumbnails/images from an XPS document.

Background

Recently, I came across a requirement for displaying thumbnails of XPS documents in a SharePoint document library. As a hardcore developer, I'm not in favor of readymade third-party components unless and until you really need them. Hence, I decided to create an image generator myself. I explored the native .NET methods for reading XPS documents. After exploring, I found that in .NET Framework 3.0, there is a managed DLL called ReachFramework.dll, which has all the necessary classes and methods for reading and writing XPS documents.

Classes

Class Diagram

ClassDiagram.jpg

XpsThumbnail Class

This is the one and only class which actually generates the thumbnails from XPS documents using the GenerateThumbnail method:

C#
converter.GenerateThumbnail();

Properties

PropertyDescription
OutputFormatOutput format for the generated image.
OutputQualityQuality for the generated image.
OutputStreamMemoryStream object to be returned.
XpsFileNameXPS document of which an image needs to be generated.

Complete Class Listing

C#
/// <summary>
/// Provides methods for converting XPS document in to various image format
/// </summary>
public class XpsImage
{
    private BitmapEncoder bitmapEncoder = null;
    /// <summary>
    /// Default constructor
    /// </summary>
    public XpsImage()
    {
    }

    /// <summary>
    /// Sets the XPS file to be read
    /// </summary>
    public String XpsFileName { private get; set; }

    /// <summary>
    /// Gets or Sets the image format for thumbnail
    /// </summary>
    public OutputFormat OutputFormat {get; set; }

    /// <summary>
    /// Gets or Sets the image quality for thumbnail
    /// </summary>
    public OutputQuality OutputQuality { private get; set; }
    
    /// <summary>
    /// Returns the Memory stream of generated thumbnail
    /// </summary>
    public MemoryStream OutputStream { get; private set; }

    /// <summary>
    /// Generate the thumbnail of given document
    /// and populates the ThumbnailStream property
    /// </summary>
    public void GenerateThumbnail()
    {
        XpsDocument xpsDocument = 
          new XpsDocument(this.XpsFileName, FileAccess.Read);
        FixedDocumentSequence documentPageSequence = 
          xpsDocument.GetFixedDocumentSequence();
        
        string fileNameWithoutExtension = 
          Path.GetFileNameWithoutExtension(this.XpsFileName);
        string fileExtension = string.Empty;

        switch (this.OutputFormat)
        {
            case OutputFormat.Jpeg:
                fileExtension = ".jpg";
                bitmapEncoder = new JpegBitmapEncoder();
                break;
            case OutputFormat.Png:
                fileExtension = ".png";
                bitmapEncoder = new PngBitmapEncoder();
                break;
            case OutputFormat.Gif:
                fileExtension = ".gif";
                bitmapEncoder = new GifBitmapEncoder();
                break;
            default:
                fileExtension = ".jpg";
                bitmapEncoder = new JpegBitmapEncoder();
                break;
        }
        
        double imageQualityRatio = 1.0;
        switch (this.OutputQuality)
        {
            case OutputQuality.Low:
                imageQualityRatio /= 2.0;
                break;

            case OutputQuality.Good:
                imageQualityRatio *= 2.0;
                break;

            case OutputQuality.Super:
                imageQualityRatio *= 3.0;
                break;
            default:
                imageQualityRatio *= 1.0;
                break;
        }

        DocumentPage documentPage = 
           documentPageSequence.DocumentPaginator.GetPage(0);
        RenderTargetBitmap targetBitmap = new RenderTargetBitmap(
          (int)(documentPage.Size.Width * imageQualityRatio), 
          (int)(documentPage.Size.Height * imageQualityRatio), 
          96.0 * imageQualityRatio, 96.0 * imageQualityRatio, 
          PixelFormats.Pbgra32);
        targetBitmap.Render(documentPage.Visual);

        bitmapEncoder.Frames.Add(BitmapFrame.Create(targetBitmap));
        string str4 = string.Format("{0}{1}", 
                       fileNameWithoutExtension, fileExtension);
        MemoryStream memoryStream = new MemoryStream();
        bitmapEncoder.Save(memoryStream);
        this.OutputStream = memoryStream;
        xpsDocument.Close();
    }
}

Using the Code

The class itself is a very simple class and is made for simplicity. Below is a small snippet of how to utilize the class:

C#
converter.XpsFileName = "XPSdocument.xps";
converter.OutputFormat = OutputFormat.Png;
converter.OutputQuality = OutputQuality.Super;
converter.GenerateThumbnail();

Conclusion

The sample application provided with this article demonstrates the utilization of the code. In the demo application, you need to save the image by invoking a context menu from the thumbnail to see the output as I'm using an in-memory image stream to display the image on the picture box.

And, please don't hesitate to provide feedback, good or bad! I hope you enjoyed this article.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United States United States
My name is Pravesh Soni and I’m software professional. I got involved with computers since last two decades starting with playing games developed in BASIC. I am a tech enthusiast and I love writing code, blogging, science fiction, cartoons, music, robotics and I am a big Microsoft fan too.

I started programming in classic asp but later switch to .net and now at present I have almost 15 years of development experience in Microsoft technologies. I got involved in customized software development in my career of programming, now contributing to some open source community development.

Comments and Discussions

 
BugGetting exception Pin
NIRAVRANA1-Sep-13 23:13
NIRAVRANA1-Sep-13 23:13 
GeneralRe: Getting exception Pin
NIRAVRANA1-Sep-13 23:15
NIRAVRANA1-Sep-13 23:15 
GeneralMy vote of 5 Pin
masbaaz3-Jun-13 2:07
masbaaz3-Jun-13 2:07 
GeneralXps document thumbnail Pin
rohinisreekanth25-Nov-10 18:25
rohinisreekanth25-Nov-10 18:25 
GeneralRe: Xps document thumbnail Pin
Pravesh Soni27-Dec-10 3:02
Pravesh Soni27-Dec-10 3:02 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.