我们有一个管理打印文档的项目 . 起初我想知道为什么不能在一个地方设置打印选项 . 例如 printer tray selection 用于第一页和其他页面可以使用 MS Word automation 完成:
var doc = _applicationObject.Documents.OpenNoRepairDialog(FileName: ref sourceFile, ReadOnly: ref readOnly,
AddToRecentFiles: ref addToRecentFiles,
Visible: ref visible);
doc.PageSetup.FirstPageTray = (WdPaperTray) firstPageTrayCode;
doc.PageSetup.OtherPagesTray = (WdPaperTray) otherPagesTrayCode;
_applicationObject.ActivePrinter = printerPath;
doc.Activate();
_applicationObject.PrintOut(Background: ref backgroundPrint, FileName: sourceFile);
doc.Close(ref saveChanges, ref _missing, ref _missing);
在上面的代码中,打印机托盘被指定为整数,因为某些打印机没有托盘的标准值(我们在HP时出现此问题 - 它的托盘代码描述为here) . 所以我们首先使用代码检索托盘打印机的内容:
var setting = new PrinterSettings();
setting.PrinterName = myPrinterName;
foreach (PaperSource tray in setting.PaperSources)
{
Console.WriteLine("\t{0}: #{1}", tray.SourceName, tray.RawKind);
}
这段代码没有任何问题 .
但是这里没有办法指定双面打印和装订选项 . Duplex 可以使用 driver functions OpenPrinter and SetPrinter 完成,如here所描述,并由Microsoft推荐this forum thread . Staple 完全是 unclear ,如果有人知道如何实现这一点,请告诉我 . 使用Stapling枚举,就像this MSDN article一样没用,因为它需要自定义渲染要打印的文档 .
我描述了这种情况以及零件的实施方式 . 这在我们的环境中运行良好:Windows Server 2008 R2,MS Office 2010 x32,打印机HP LaserJet P2055和Ricoh Nashuatec DSm635 . 使用原生和通用PCL6 / PCL5e驱动程序进行测试:双工和托盘选择按预期工作 .
但在将应用程序部署到客户端后,打印机(HP LaserJet 4250和Ricoh Aficio MP C7501) do printing always from default tray and without duplex . 尝试了几个不同的驱动程序,结果完全相同 .
在这两种环境中,打印机都是网络打因此,为了使它们应用双工设置,使用打印机驱动程序,我们需要在服务器上安装本地驱动程序并制作本地打印机,如我所推荐的微软this support forum thread .
虽然使用的环境和打印机看起来非常相似,但其中一个不起作用 . 任何帮助将受到高度赞赏 .
1 回答
如果其他人需要它,我想出了一个解决方法,基于将打印机设置内存块存储在二进制文件中,然后恢复它 . 这个想法在this blog post中有描述,但是当它只是复制粘贴时它对我不起作用(它仅适用于某些驱动程序和某些设置,而其他打印选项被忽略) .
所以我重新制作了一下,现在它可以支持我在任何打印机上试过的所有设置(带兼容的驱动程序)我已经测试过了 . 当然,如果您使用其他打印机的驱动程序,例如它将无法正常工作 .
这种方法的缺点当然是你应该首先将默认的打印机首选项(在控制面板中)设置为你需要的 . 当然,这并非总是可行的,但至少在某些情况下它可以提供帮助 .
因此,测试工具的完整源代码能够将打印机设置存储到文件中,再次将此文件加载到打印机中并使用指定的设置文件打印文档:
UPDATE 2018-12-04 (in 5,5 years): 在这段代码中Marshal.StructureToPtr调用有一个令人讨厌的罕见问题,今天我终于得到了that question的答案(参见Hans Passant的评论) . 我无法验证这是否真的有效,因为我不再处理该项目,但是如果您尝试使用此代码,则可能需要应用该修复程序 .