none
文字列を印刷したい RRS feed

  • 質問

  • Visual C# 2019
    UWP
    バージョン1809

    特定の文字列をプリンタに印刷したいのですが、方法論が全くわかりません。

    調べるとプリンタ設定を選択するダイアログがでてきて、そこでプリンタを指定して印刷を押すとxamlの内容?を印刷する、
    というものは見つけましたが、私がやりたいのは、『ダイアログなど出ず、複数行に渡る文字列を特定のプリンタに印刷』になります。

    特定のプリンタは予め決まっているので、プリンタ名などで指定できればいいのですが、調べても全くやり方が出てきません。

    どうすると実現できるのでしょうか?

    2020年2月21日 5:41

回答

  • 私の先の投稿は「.NET アプリを内包する or 連携するということは、通常の UWP アプリとしての申請・審査とは異なることになる」という警鐘を鳴らす意図でしたが、サイドローディングを選択されているので、杞憂だったと言うことになります。
    (代案の用意はありません)

    2020年3月26日 12:22
    モデレータ

すべての返信

  • RawPrintnugetで入れて以下のように

    namespace App1
    {
        using System;
        using System.IO;
        using System.Linq;
        using System.Runtime.InteropServices.WindowsRuntime;
        using Windows.Devices.Enumeration;
        using Windows.UI.Xaml;
        using Windows.UI.Xaml.Controls;
    
        public sealed partial class MainPage : Page
        {
            public MainPage()
            {
                this.InitializeComponent();
            }
    
            private async void Button_Click(object sender, RoutedEventArgs e)
            {
                var devices = await DeviceInformation.FindAllAsync(@"System.Devices.InterfaceClassGuid:=""{0ecef634-6ef0-472a-8085-5ad023ecbccd}""");
                var names = devices.Select(_ => _.Name).ToArray();
    
                var dev = devices.FirstOrDefault(_ => _.Name.Contains("Microsoft XPS Document Writer"));//とりあえずWindows10にあるXPSプリンタを指定してみる
                if (dev == null)
                {
                    return;
                }
    
                //既存のXPSファイルを読み込んで印刷してみる
                var picker = new Windows.Storage.Pickers.FileOpenPicker();
                picker.FileTypeFilter.Add(".oxps");
                picker.FileTypeFilter.Add(".xps");
    
                var xps = await picker.PickSingleFileAsync();
                if (xps != null)
                {
                    var storage = await xps.OpenReadAsync();
                    var stream = storage.AsStreamForRead();
    
                    RawPrint.IPrinter printer = new RawPrint.Printer();
                    printer.PrintRawStream(dev.Name, stream, @"test.oxps");//XPSやPDFのようなファイル出力になるのはドキュメントフォルダに
                }
            }
        }
    }

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2020年2月21日 11:28
  • takiruさん、こんにちは。フォーラムオペレーターのクモです。 
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご質問いただいた件ですが、その後いかがでしょうか。
    gekkaさんから寄せられた投稿はお役に立ちましたか。

    参考になった投稿には [回答としてマーク] をお願い致します。

    設定いただくことで、
    他のユーザーもお役に立つ回答を見つけやすくなります。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。


    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年2月25日 5:27
    モデレータ
  • ありがとうございます。

    このライブラリは知らなかったので試してみました。

    フォントが選べない、フォントサイズが選べない、日本語が化ける

    ため、実用に耐えられないようでした。

    2020年2月25日 6:08
  • takiruさん、こんにちは。フォーラムオペレーターのクモです。
    ご返信いただきありがとうございます。

    現在、UWP APIはサイレント印刷をサポートしていません。
    印刷アクションUIを呼び出さないと、xamlを印刷できません。

    複数行にわたる文字列を印刷したい場合は、次のコードサンプルのpagetoprintファイルを参照し、
    RichTextBlockを使用してテキストをレンダリングします。

    そして、公式ドキュメントをご参照ください。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年2月25日 9:16
    モデレータ
  • ありがとうございます。

    調べた結果、下記手段で、印刷部分を.NET Frameworkアプリケーション側で担うことで対応することができそうでした。

    http://zawayasoft.com/2018/03/13/uwp-print-pdf-files-silently-without-print-dialog/

    2020年2月26日 8:38
  • 調べた結果、下記手段で、印刷部分を.NET Frameworkアプリケーション側で担うことで対応することができそうでした。

    「UWP 以外と連携する」を検討されているそうですが、通常の UWP アプリでなくても良いということですか?
    たとえば、サイドローディングでインストーするか、特殊な審査を通すかとなりそうですが、大丈夫そうですか?

    2020年2月26日 13:01
    モデレータ
  • takiruさん、こんにちは。フォーラムオペレーターのクモです。
    ご返信いただきありがとうございます。

    .NET Frameworkアプリケーションで印刷部分を処理し、UWPアプリパッケージに含まれるfulltrustプロセスのWin32印刷APIで対応しても大丈夫です。
    詳細については、UWPアプリケーションのタイトルからサイレントプリントの方法に関する関連情報を検索してください。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年2月27日 7:05
    モデレータ
  • Azuleanさん

    実際にユーザーが利用するアプリケーションとしては、通常のUWPアプリケーションでなければなりません。
    社内利用のため、サイドローディングを行います。

    今回は印刷部分だけ実現できないので、仕方ないから印刷部分に限って.NET Framework側に委ねる形を取りましたが、
    そのようなことをしなくても、というような代案が他にもあるでしょうか?

    2020年3月26日 5:08
  • 私の先の投稿は「.NET アプリを内包する or 連携するということは、通常の UWP アプリとしての申請・審査とは異なることになる」という警鐘を鳴らす意図でしたが、サイドローディングを選択されているので、杞憂だったと言うことになります。
    (代案の用意はありません)

    2020年3月26日 12:22
    モデレータ