如何以编程方式在.NET上的信头纸,卡片纸,预打印纸上打印

时间:2015-11-30 16:47:39

标签: c# .net wcf printing system.printing

我正在尝试使用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应用程序或服务中使用。   尝试在其中一个应用程序中使用这些类   类型可能会产生意想不到的问题,例如服务减少   性能和运行时异常。

我唯一可用的其他选项是让用户手动设置每台打印机,并在数据库的每个托盘中使用某种用户界面设置纸张类型。然后我会设置托盘打印。如果可能,我想避免这种情况。

更新DEC 14 2015年

打印机制造商愿意提供付费解决方案,但目前该项目不可行。

粗略的代码解决方案是:

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

1 个答案:

答案 0 :(得分: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