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;
}