2015年5月11日月曜日

WPF で横長(Landscape)印刷をする

久しぶりに WPF の内容。
正直、こういった技術系の内容は時間が無いと書けない。

何故か?動くコードを載せたいけど、実業務で動いているコードは載せれないし、それを加工するにも結構時間がかかるから。

だから、技術系の blog 書いている人とか、専門サイトに記事を投稿している人はすごいと思う。
あと、ブログとは関係ないけど、動画を上げている人も同様。

いずれも内容がさらっと読めたり、動画見ている時間があっと言う間に過ぎていく様に仕上げるには相当な時間と経験が必要。
やったことない人にしてみたら、大した作業(内容)でないと思うかもしれないが、実際にやってみると結構大変かつ時間がかかる作業というのがわかると思う。きっといい経験ができるだろう。

前置きが少し長くなったが、今回は WPF で横長の印刷を行う部分で困っていたが、なんとか印刷できるようになったので、雰囲気程度にコードを載せようと思います。
実コードから居る部分だけ残したので、動かないコードだとは思います(さっきと言っている内容が違うのは気にしない)。

    PrintDialog printDialog = new PrintDialog();
    if (printDialog.ShowDialog() == true) {
 
        System.Windows.Documents.FixedDocument fixedDoc = new System.Windows.Documents.FixedDocument();
 
        HogePaper paper = new HogePaper();
        var PageSize = new Size(paper.Height, paper.Width);
        paper.Content = null;
 
        System.Windows.Documents.FixedPage fixedPage = new System.Windows.Documents.FixedPage();
        fixedPage.DataContext = this;
        fixedPage.Children.Add(paper.PrintArea);
 
        fixedPage.Measure(PageSize);
        // Point 1!! XAML の画面幅を指定する。
        fixedPage.Arrange(new Rect(15, 15, PageSize.Height, PageSize.Width));
 
        fixedPage.UpdateLayout();

        // Point 2!! 印字出力範囲を指定する
        fixedPage.Width = 11.69 * 96;
        fixedPage.Height = 8.27 * 96;

        System.Windows.Documents.PageContent pageContent = new System.Windows.Documents.PageContent();
        ((System.Windows.Markup.IAddChild)pageContent).AddChild(fixedPage);
        fixedDoc.Pages.Add(pageContent);
 
        paper.Close();
 
        try {
            // Point 3!! XPS 以外の印刷時に横長にする。
            printDialog.PrintTicket.PageOrientation = System.Printing.PageOrientation.Landscape;
            printDialog.PrintDocument(fixedDoc.DocumentPaginator, "print a hoge");
        } catch (ArgumentException) {
            return;
        }
    }

XAML 側については、Width(29.7cm) と、Height(21cm) の指定をしてしておく必要があります。

Point1, 2 については、印刷の範囲を指定する部分となります。
ここを指定しないと、用紙は横長なのにデータは縦長で印字される状態になります。

Point 3 については、直接プリンタ出力だったり、PDF に出力すると、これまた用紙が横なのに縦印刷になるという状態になるのを防ぐための指定。
ふざけているのかと思うのが、XPS への出力場合はこの指定がなくても良いということ。あっても問題ないので付けておくほうがよいでしょう。

しかし印刷するだけなのにここまで、面倒なのか。。。
最初は組み合わせや、プロパティの指定などが分からず、いくらやっても縦長で表示しかされないので、きっと横長印刷はできないんだと思い込んだぐらい。

調べるにしてもキーワードが分からず、魂が抜けかけたが、stackoverflow に助けられた。
http://stackoverflow.com/questions/2493244/wpf-to-xps-in-landscape-orientation
http://stackoverflow.com/questions/26624838/print-a-usercontrol-to-the-center-of-an-a4-page

本当にありがたい。
この記事が同じように悩んでいる人の助けになればいいがと思って締めたいと思います。

Written with StackEdit.

0 件のコメント:

コメントを投稿