Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

How to Compress Several Pages into One Page to Print in Silverlight

0.00/5 (No votes)
15 Sep 2011 1  
This article focuses on how to compress several pages' contents in one page and print in Silverlight.

Introduction

In this article, I will introduce a method to compress several pages' contents into one page and print that page in Silverlight.

Background

Silverlight 4 provides a print function which can be used in enterprise projects more easily. And this means that Silverilght is not just used for demonstrations and create small components for uploading files.

The print function is easy to use but there are some inconveniences, for example, we must calculate how many pages the materials have because it cannot tell us. Therefore, some users create methods to print multiple pages in Silverlight.

But I want to talk about another situation where I want to print my material in one page although it has several pages. So I need to compress the width or height to print.

Let's take an example. The following image is a simple Silverlight program. There is a list on homepage which displays a 100 columns data. It is obvious that it will be over one page if printing.

2.gif

After using the code, the 100 columns data is printed in one page (see following image).

1.gif

It is not very clear after being enlarged. Therefore, if your contents are not suitable for compressing, the result will be as above.

Using the code

Page definition

<UserControl
    xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    x:Class="SilverlightApplication2.MainPage"
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="400"
    xmlns:c="clr-namespace:SilverlightApplication2">

   <Grid x:Name="LayoutRoot" Background="White">

   <ScrollViewer>
        <StackPanel>
            <ListBox x:Name="lstData" Padding="50" 
              BorderBrush="Transparent" ItemsSource="{Binding}">
            <!--Define this converter to enable compress 
                      and display based on 100% by default-->
            <ListBox.RenderTransform>
            <ScaleTransform x:Name="st" ScaleX="1" 
              ScaleY="1"></ScaleTransform>
            </ListBox.RenderTransform>

           <ListBox>
            <Button Content="Print" x:Name="btPrint" 
              Width="100" Click="btPrint_Click" 
              HorizontalAlignment="Left"></Button>
        <StackPanel>
   </ScrollViewer>
</Grid>
</UserControl>

Background code

using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Printing;

namespace SilverlightApplication2
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(MainPage_Loaded);
        }
        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            //Prepare 100 Column Testing Data
            this.DataContext = Enumerable.Range(1, 100).Select(i => new Data()
            {
                ID = i,
                Name = "Steve Paul Jobs"
            });
        }
        private void btPrint_Click(object sender, RoutedEventArgs e)
        {
            //Actual Height of List
            var ah = lstData.ActualHeight;
            //Actual Width of List
            var aw = lstData.ActualWidth;
            //Create a New Print Document
            var doc = new PrintDocument();
            //Do Print Event
            doc.PrintPage += (o, a) =>
            {
                //Select Printer and Provide Print Height
                var h = a.PrintableArea.Height;
                //Select Printer and Provide Print Width
                var w = a.PrintableArea.Width;
                //Compress Width if not Enough
                if(aw > w) st.ScaleX = w / aw;
                //Compress Height if not Enough
                if(ah > h) st.ScaleY = h / ah;
                //Set Print Content
                a.PageVisual = lstData;
            };
            //Do Event after Printing
            doc.EndPrint += (o, a) =>
            {
                //Compress List to 100% again
                st.ScaleX = 1;
                st.ScaleY = 1;
            };
            //Print 
            doc.Print(null);
        }
    }
    class Data
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public override string ToString()
        {
            return string.Format("ID={0:000},Name={1}", ID, Name);
        }
    }
}

Conclusion

The key to this example is that Silverlight and WPF support transformation through different translators when presenting. ScaleTransform is the easiest one which can compress based on scale. Also, there are several other translators in Silverlight.

Addition

In addition, I found a blog which shows many Silverlight skills and I want to recommend this to you: http://janewdaisy.wordpress.com/category/silverligh/.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here