■ DocumentPaginator 클래스 : 배너 문서 페이지 번호 생성자 만들기 예제

----------------------------------------------------------------------------------------------------

using System.Printing;

using System.Windows;

using System.Windows.Controls;

 

PrintDialog printDialog = new PrintDialog();

 

if(printDialog.ShowDialog().GetValueOrDefault())

{

    PrintTicket printTicket = printDialog.PrintTicket;

 

    printTicket.PageOrientation = PageOrientation.Portrait;

 

    printDialog.PrintTicket = printTicket;

 

    BannerDocumentPaginator bannerDocumentPaginator = new BannerDocumentPaginator();

 

    bannerDocumentPaginator.Text = "ABCDEFG";

 

    bannerDocumentPaginator.PageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);

 

    printDialog.PrintDocument(bannerDocumentPaginator, "Banner : ABCDEFG");

}

----------------------------------------------------------------------------------------------------

 

■ DocumentPaginator 클래스 : 배너 문서 페이지 번호 생성자 만들기

----------------------------------------------------------------------------------------------------

using System;

using System.Globalization;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Media;

 

/// <summary>

/// 배너 문서 페이지 번호 생성자

/// </summary>

public class BannerDocumentPaginator : DocumentPaginator

{

    //////////////////////////////////////////////////////////////////////////////////////////////////// Field

    ////////////////////////////////////////////////////////////////////////////////////////// Private

 

    #region Field

 

    /// <summary>

    /// 텍스트

    /// </summary>

    private string text = "";

 

    /// <summary>

    /// 타입 페이스

    /// </summary>

    private Typeface typeface = new Typeface("");

 

    /// <summary>

    /// 페이지 크기

    /// </summary>

    private Size pageSize;

 

    /// <summary>

    /// 최대 크기

    /// </summary>

    private Size maximumSize = new Size(0, 0);

 

    #endregion

 

    //////////////////////////////////////////////////////////////////////////////////////////////////// Property

    ////////////////////////////////////////////////////////////////////////////////////////// Public

 

    #region 텍스트 - Text

 

    /// <summary>

    /// 텍스트

    /// </summary>

    public string Text

    {

        set

        {

            this.text = value;

        }

        get

        {

            return this.text;

        }

    }

 

    #endregion

 

    #region 타입 페이스 - Typeface

 

    /// <summary>

    /// 타입 페이스

    /// </summary>

    public Typeface Typeface

    {

        set

        {

            this.typeface = value;

        }

        get

        {

            return this.typeface;

        }

    }

 

    #endregion

 

 

    #region 페이지 번호 무결성 여부 - IsPageCountValid

 

    /// <summary>

    /// 페이지 번호 무결성 여부

    /// </summary>

    public override bool IsPageCountValid

    {

        get

        {

            foreach(char character in this.text)

            {

                FormattedText formattedText = GetFormattedText(character, this.typeface, 100);

 

                this.maximumSize.Width  = Math.Max(this.maximumSize.Width , formattedText.Width );

                this.maximumSize.Height = Math.Max(this.maximumSize.Height, formattedText.Height);

            }

 

            return true;

        }

    }

 

    #endregion

 

    #region 페이지 수 - PageCount

 

    /// <summary>

    /// 페이지 수

    /// </summary>

    public override int PageCount

    {

        get

        {

            return this.text == null ? 0 : this.text.Length;

        }

    }

 

    #endregion

 

    #region 페이지 크기 - PageSize

 

    /// <summary>

    /// 페이지 크기

    /// </summary>

    public override Size PageSize

    {

        set

        {

            this.pageSize = value;

        }

        get

        {

            return this.pageSize;

        }

    }

 

    #endregion

 

    #region 소스 - Source

 

    /// <summary>

    /// 소스

    /// </summary>

    public override IDocumentPaginatorSource Source

    {

        get

        {

            return null;

        }

    }

 

    #endregion

 

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method

    ////////////////////////////////////////////////////////////////////////////////////////// Public

 

    #region 페이지 구하기 - GetPage(pageNumber)

 

    /// <summary>

    /// 페이지 구하기

    /// </summary>

    /// <param name="pageNumber">페이지 번호</param>

    /// <returns>DocumentPage</returns>

    public override DocumentPage GetPage(int pageNumber)

    {

        DrawingVisual drawingVisual = new DrawingVisual();

 

        DrawingContext drawingContext = drawingVisual.RenderOpen();

 

        double factor = Math.Min

        (

            (PageSize.Width  - 96) / this.maximumSize.Width,

            (PageSize.Height - 96) / this.maximumSize.Height

        );

 

        FormattedText formattedText = GetFormattedText(this.text[pageNumber], this.typeface, factor * 100);

 

        Point textPoint = new Point

        (

            (PageSize.Width  - formattedText.Width ) / 2,

            (PageSize.Height - formattedText.Height) / 2

        );

 

        drawingContext.DrawText(formattedText, textPoint);

 

        drawingContext.Close();

 

        return new DocumentPage(drawingVisual);

    }

 

    #endregion

 

    ////////////////////////////////////////////////////////////////////////////////////////// Private

 

    #region 포맷 텍스트 구하기 - GetFormattedText(character, typeface, emSize)

 

    /// <summary>

    /// 포맷 텍스트 구하기

    /// </summary>

    /// <param name="character">문자</param>

    /// <param name="typeface">타입 페이스</param>

    /// <param name="emSize">EM 크기</param>

    /// <returns>FormattedText</returns>

    private FormattedText GetFormattedText(char character, Typeface typeface, double emSize)

    {

        return new FormattedText

        (

            character.ToString(),

            CultureInfo.CurrentCulture,

            FlowDirection.LeftToRight,

            typeface,

            emSize,

            Brushes.Black

        );

    }

 

    #endregion

}

----------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요