我正在尝试使用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;
}
答案 0 :(得分:0)
这曾经如何工作,可能仍然使用.NET,所有这些功能都特定于打印机驱动程序。它们不会作为可调用的API公开。用户可在运行时配置哪种纸张尺寸和类型等。驱动程序将更改用于将墨水粘贴到纸张上的精确方法,这不属于您的业务。
然而,驱动程序会告诉您打印的纸张有多大,您可以相应地重新输出输出。您还可以选择以编程方式自行翻转渲染以制作纵向和横向。
您可以保存并加载打印机配置“页面设置”。因此,您可以让用户使用不同的纸盘选择配置不同的“页面设置”,并在打印时在它们之间切换。