1

System.Drawing.Printing ライブラリを使用して WCF サービスから印刷しようとしています。問題は、このライブラリで利用できないように見えるレターヘッド、カードストック、または印刷済みの用紙の用紙タイプ (またはメディア タイプ) を選択しようとしていることです。

System.Drawing.Printing には PageSettings クラスがありますが、PaperSize しか設定できず、レターヘッド、カードストック、印刷済みなどの PaperSize はありません。 https://msdn.microsoft.com/en-us/library/System .Drawing.Printing.PageSettings(v=vs.110).aspx

また、PrinterSettings.PaperSources の PaperSource クラスには、各トレイにある用紙の種類に関する情報は含まれていません。

プリンターがどのトレイから印刷するかを認識できるように、送信する印刷ジョブが正しい設定であることを確認する方法を誰かが推奨していますか?

これを行う方法がなければなりません。たとえば、Word または Excel から印刷するときにレターヘッドを選択できますが、それはプリンターのプロパティに移動するときだけです。.NET でこれをプログラムで実行できないのはなぜですか? これはマネージ コードの制限ですか? プリンタードライバーにアクセスする必要がありますか?

System.Printing でさえ、これらのオプションを利用できません。また、MSDN は次のように述べています。

注意: System.Printing 名前空間内のクラスは、Windows サービスまたは ASP.NET アプリケーションまたはサービス内での使用はサポートされていません。これらのアプリケーション タイプのいずれかからこれらのクラスを使用しようとすると、サービス パフォーマンスの低下やランタイム例外など、予期しない問題が発生する可能性があります。

私が利用できる他の唯一のオプションは、ユーザー インターフェイスを備えたデータベース内の各トレイの用紙の種類を使用して、ユーザーが各プリンターを手動で設定することです。次に、印刷するトレイを設定するだけです。できればこれは避けたいです。

2015 年 12 月 14 日更新

プリンタ メーカーは有償のソリューションを提供する意思がありますが、現時点ではこのプロジェクトでは実行できません。

大まかなコードの解決策は次のとおりです。

private PrintJobStatusEnum SendToPrinter(PrintDocumentModel printJob, out List<string> errors)
        {
            errors = new List<string>();

            // The print job includes the printer and page settings
            var printerSettings = new PrinterSettings
            {
                PrinterName = "MyPrinterName",
                Duplex = printJob.IsDuplex ? Duplex.Vertical : Duplex.Simplex
            };

            // Set the paper size
            var paperKind = PaperKind.Letter;

            // Find the paper size in the available sizes on the printer
            var paperSizes = printerSettings.PaperSizes.Cast<PaperSize>().AsQueryable();
            var paperSize = paperSizes.FirstOrDefault(p => p.Kind == paperKind);

            // Set the paper source (tray)
            var paperSources = printerSettings.PaperSources.Cast<PaperSource>().AsQueryable();

            // The SourceName is different for many printers. 
            // Double-check yours through PrinterSettings.PaperSources
            var paperSource = paperSources.FirstOrDefault(s => s.SourceName == "Cassette 1");
            if (paperSource == null)
            {
                paperSource = paperSources.FirstOrDefault(s => s.Kind == PaperSourceKind.AutomaticFeed);
            }

            // Set up the page
            var pageSettings = new PageSettings
            {
                Landscape = printJob.PaperOrientationLookUpId == MyConstants.PaperOrientationLandscape,
                Margins = new Margins(0, 0, 0, 0), // Not sure if margins are needed
                PaperSize = paperSize ?? new PaperSize("Letter", 850, 1100),
                Color = printJob.IsColor,
                PaperSource = paperSource,
                PrinterSettings = printerSettings
            };


            // Send document, printer settings and page settings to print handler
            List<string> printErrors;

            var result = _pdfPrintHandler.Print(printerSettings, pageSettings, printJob, out printErrors);
            errors.AddRange(printErrors);

            return result;
        }
4

1 に答える 1

0

これが以前はどのように機能し、おそらく .NET でも機能していたかというと、これらの機能はすべてプリンター ドライバーに固有のものです。それらは、呼び出し可能な API として公開されていません。実行時にユーザーが設定できる用紙のサイズや種類など。ドライバーは、インクを紙に付着させるために使用する正確な方法を変更しますが、それはあなたの仕事ではありません.

ただし、ドライバーは印刷する用紙のサイズを通知するので、それに応じて出力を再加工できます。プログラムでレンダリングを自分で反転して、縦向きと横向きにすることもできます。

プリンター構成の「ページ設定」を保存およびロードできます。したがって、ユーザーにさまざまなトレイ選択でさまざまな「ページ設定」を構成させ、印刷時にそれらを切り替えることができます。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/0e1194ee-d71b-45b4-b4c2-5b626a100d30/windows-print-spooler-api-and-paper-tray-selection?forum=netfxbcl

于 2015-12-02T16:55:32.480 に答える