プリンターを使って印刷するには

プリンターへのアクセス

WindowsRuntimeでは周辺機器へのアクセスはDeviceInformationクラスでデバイスを列挙して特定しますが、プリンターの場合はチャームのデバイス→印刷を表示することで現在アクセス可能なプリンター一覧が表示され、ユーザーが任意のプリンターを選択するという形になります。

32

 

したがって、プリンターで印刷をするために開発者側がすることは、プリントしたいドキュメントをPrintManagerクラスに投げるだけです。

どのプリンターで印刷するか、印刷をするかどうかはユーザーの選択に任せることになっています。

 

印刷用ページの作成

WindowsRuntimeで印刷を行うことができるものは、UIElementとそれを継承するクラスです。

UIElementはほとんどのXAMLコントロールの基底となるクラスですのでほとんどのコントロールは印刷が可能です。

したがって、画像やドキュメントなどを印刷したい場合、一度XAMLコントロール上に置きます。

 

今回は3ページ印刷するために一つ一つのページをCanvasコントロールで定義します。

<Canvas x:Name="canvasPage1" HorizontalAlignment="Left" Height="500" VerticalAlignment="Top" Width="500">
    <Canvas.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="#FF6C1A1A" Offset="0"/>
            <GradientStop Color="#FFAC5B5B" Offset="1"/>
        </LinearGradientBrush>
    </Canvas.Background>
    <TextBlock Text="Page1" FontSize="20" />
</Canvas>
<Canvas x:Name="canvasPage2" HorizontalAlignment="Left" Height="500" VerticalAlignment="Top" Width="500">
    <Canvas.Background>
        <ImageBrush Stretch="Fill" ImageSource="Assets/1.PNG"/>
    </Canvas.Background>

    <TextBlock Text="Page2" FontSize="20" Foreground="#FF171717" />
</Canvas>
<Canvas x:Name="canvasPage3" HorizontalAlignment="Left" Height="500" VerticalAlignment="Top" Width="500" Background="#FF4672A6">
    <TextBlock Text="Page3" FontSize="20" />
</Canvas>

 

XAMLでページが定義できたら、一度コンストラクタでUIElementのコレクションに入れておきましょう。

ページは複数(今回は3ページ)なのでUIElementのコレクションにいれることで扱いやすくなります。

List<UIElement> pageElementList;
//コンストラクタ
public PrinterControl()
{
    this.InitializeComponent();

    pageElementList = new List<UIElement>();
    pageElementList.Add(this.canvasPage1);
    pageElementList.Add(this.canvasPage2);
    pageElementList.Add(this.canvasPage3);

}

 PrintDocumentの作成

印刷するドキュメントはPrintDocumentというクラスで定義されます。

このクラスは少し特殊で、何かしらの要求が来た時、そのイベントを使って印刷するコンテンツを追加します。

33

 

PrintDocumentを使うには、まずPrintDocumentをnewします。

PrintDocument document = new PrintDocument();

 

つづいて、プレビュー要求がきたときのイベントを処理します。

Paginateイベントはプレビュー要求がきたときにプレビューページの最大数を設定する必要があります。

document.Paginate += (s, arg) =>
{
    //プレビューウインドウが要求されたときに発生
    //ページ数の情報を渡す
    PrintDocument doc = (PrintDocument)s;
    doc.SetPreviewPageCount(pageElementList.Count,PreviewPageCountType.Intermediate);
};

GetPreviewPageイベントはプレビュー要求がきたときにプレビューページをすべて設定します。

document.GetPreviewPage += (s, arg) =>
{
    //プレビューウインドウが要求されたとき
    //プレビューに表示するページを登録する
    PrintDocument doc = (PrintDocument)s;
    for (int i = 0; i < pageElementList.Count;i++ )
    {
        doc.SetPreviewPage((i+1),pageElementList[i]);
    }
};

AddPagesイベントは印刷要求がきたときに印刷したいページをすべてAddPageします。

すべてAddできたらAddPagesCompleteメソッドを最後に呼んで印刷ページの追加を完了します。

document.AddPages += (s, args) =>
{
    //印刷要求がきたとき
    //印刷するページを登録する
    PrintDocument doc = (PrintDocument)s;
    for (int i = 0; i < pageElementList.Count; i++)
    {
        doc.AddPage(pageElementList[i]);
    }

    doc.AddPagesComplete();
};

これでPrintDocumentの処理は完了です。

PrintMangerでチャームに登録

先ほど作成したPrintDocumentをチャームに登録するにはPrintManagerクラスを使います。

このクラスもPrintDocument同様、要求イベントが来た時に応じで処理をします。

 

PrintTaskRequestedイベントはユーザーがチャームの印刷を押した時に発生します。

ここでCreatePrintTaskメソッドによってPrintDocumentのDocumentSourceプロパティを渡します。

CreatePrintTaskは別スレッドで呼び出されるのでDispatcher.RunAsyncメソッドでUIスレッドに戻します。

 

また、CreatePrintTaskメソッドは第一引数で印刷Paneに表示されるタイトルをかえることができます。

PrintManager manager = PrintManager.GetForCurrentView();
string title = "Print Sample";
manager.PrintTaskRequested += (s, arg) =>
{
    //チャームから印刷が押された時
    PrintTask task= arg.Request.CreatePrintTask(title,async requested =>
    {
        await document.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            requested.SetSource(document.DocumentSource);
        });
        
    });

};

印刷する

以上で印刷ドキュメントの登録は完了しました。

あとは端末をプリンターに接続し、アプリからチャーム→デバイス→印刷を押すと印刷することができます。

 

印刷チャームを表示する

印刷チャームを表示することでユーザーに印刷を促すこともできます。

印刷チャームを表示するにはPrintMangerのShowPrintUIAsyncメソッドを使います。

await PrintManager.ShowPrintUIAsync();

 

サンプルコード

XAML

<Grid>
    <Button x:Name="btnPrint" Content="PrintRegister" HorizontalAlignment="Left" Margin="16,58,0,0" VerticalAlignment="Top" Click="btnPrint_Click"/>
    <FlipView Margin="0,300,0,0">
            <Canvas x:Name="canvasPage1" HorizontalAlignment="Left" Height="500" VerticalAlignment="Top" Width="500">
                <Canvas.Background>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FF6C1A1A" Offset="0"/>
                        <GradientStop Color="#FFAC5B5B" Offset="1"/>
                    </LinearGradientBrush>
                </Canvas.Background>
                <TextBlock Text="Page1" FontSize="20" />
            </Canvas>
            <Canvas x:Name="canvasPage2" HorizontalAlignment="Left" Height="500" VerticalAlignment="Top" Width="500">
                <Canvas.Background>
                    <ImageBrush Stretch="Fill" ImageSource="Assets/1.PNG"/>
                </Canvas.Background>

                <TextBlock Text="Page2" FontSize="20" Foreground="#FF171717" />
            </Canvas>
            <Canvas x:Name="canvasPage3" HorizontalAlignment="Left" Height="500" VerticalAlignment="Top" Width="500" Background="#FF4672A6">
                <TextBlock Text="Page3" FontSize="20" />
            </Canvas>
    </FlipView>
    <Button x:Name="showUI" Content="Show" HorizontalAlignment="Left" Margin="16,127,0,0" VerticalAlignment="Top" Click="showUI_Click"/>
</Grid>

C#

public sealed partial class PrinterControl : UserControl
{
    List<UIElement> pageElementList;
    string title;
    public PrinterControl()
    {
        this.InitializeComponent();
        pageElementList = new List<UIElement>();
        pageElementList.Add(this.canvasPage1);
        pageElementList.Add(this.canvasPage2);
        pageElementList.Add(this.canvasPage3);

        title = "Print Sample";
    }

    private void btnPrint_Click(object sender, RoutedEventArgs e)
    {
        PrintDocument document = new PrintDocument();


        document.Paginate += (s, arg) =>
        {
            //プレビューウインドウが要求されたときに発生
            //ページ数の情報を渡す
            PrintDocument doc = (PrintDocument)s;
            doc.SetPreviewPageCount(pageElementList.Count,PreviewPageCountType.Intermediate);
        };

        
        document.GetPreviewPage += (s, arg) =>
        {
            //プレビューウインドウが要求されたとき
            //プレビューに表示するページを登録する
            PrintDocument doc = (PrintDocument)s;
            for (int i = 0; i < pageElementList.Count;i++ )
            {
                doc.SetPreviewPage((i+1),pageElementList[i]);
            }
        };

        
        document.AddPages += (s, args) =>
        {
            //印刷要求がきたとき
            //印刷するページを登録する
            PrintDocument doc = (PrintDocument)s;
            for (int i = 0; i < pageElementList.Count; i++)
            {
                doc.AddPage(pageElementList[i]);
            }

            doc.AddPagesComplete();
        };

        
        PrintManager manager = PrintManager.GetForCurrentView();
        
        manager.PrintTaskRequested += (s, arg) =>
        {
            //チャームから印刷が押された時
            PrintTask task= arg.Request.CreatePrintTask(title,async requested =>
            {
                await document.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    requested.SetSource(document.DocumentSource);
                });
                
            });

        };
    }

    private async void showUI_Click(object sender, RoutedEventArgs e)
    {
        await PrintManager.ShowPrintUIAsync();
    }
}

 

EpsonのPX-046Aで印刷してみました。

20140922_192016764_iOS

印刷できました

20140922_192159799_iOS

目次

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください