【发布时间】:2017-04-23 15:06:58
【问题描述】:
我有多个打印机,其中包含一个“旋转 180 度”复选框,如下所示:
这是另一个(“Nee”的意思是“不”):
有没有办法以编程方式设置此值并更改PrintTicket?如果没有,我怎样才能得到它的当前值?对于我的软件,我需要知道是否设置了它,如果可能的话,是否需要更改它。对于我的软件来说,最好不用打开打印对话框,它是一款用户无需点击任何按钮就可以直接打印的软件,所以我正在寻找以编程方式设置或获取它的软件。
我一直在使用ManagementObjectSearcher 和普通的PrintDocument.DefaultPageSettings 属性进行搜索,但找不到任何东西!
如果未设置此选项,我会自动为用户临时设置它(否则它会在我的特定打印机上颠倒打印)。我一直在尝试为用户设置它,但我不知道如何让它工作。我一直在查看 DEVMODE 结构并尝试实现它,但它也没有“旋转 180 度选项”或类似的东西。
注意:我不想设置横向模式。这很简单,而且有些不同。
我尝试执行以下操作:
pdialog.PrintQueue.CurrentJobSettings.CurrentPrintTicket.PageOrientation = PageOrientation.ReversePortrait;
但是,这只会反转页面方向而不是内容(内容也需要旋转)。
如果我旋转正在打印的视觉对象,则边距不再正确,因此也不起作用!希望有人可以提供帮助。
提前致谢。
编辑
我使用 Hans 的方法来确定要更改的值。请注意,他的方法适用于任何类型的打印机! devmode 更改 PrintDialog 的值。这花了我几个小时来解决,所以对于我能帮助的人,这是我的代码,我很高兴分享或帮助!首先,我试图将 DefaultPrintTicket 从 new PrintServer() 更改为无效,但 UserPrintTicket 似乎是正确的,您可以实际看到 WindowsControl Panel if you don't switch back to the original one. *However*, this only seemed to work on just my pc (which was necessary), on a virtual machine for example themagic 中的值变化的值已经不同。这更像是实践而不是现实生活中的使用。
var pdialog = new PrintDialog();
pdialog.PrintQueue = new PrintQueue(new LocalPrintServer(), _printername, PrintSystemDesiredAccess.AdministratePrinter); // this will be your printer. any of these: new PrintServer().GetPrintQueues()
pdialog.PrintTicket.PageMediaSize = size;
pdialog.PrintTicket.CopyCount = _amount;
if (CheckPrinterDriverName(_printername))
{
int magic = 361;
var defaulttckt = pdialog.PrintQueue.UserPrintTicket;
pdialog.PrintQueue.UserPrintTicket = PrinterModifier.ChangeDevMode(pdialog, magic, vis);
pdialog.PrintQueue.Commit();
pdialog.PrintVisual(vis, "Label");
//Set back old settings so it's not permanently changed
pdialog.PrintQueue.UserPrintTicket = defaulttckt;
pdialog.PrintQueue.Commit();
}
...
class PrinterModifier
{
public static PrintTicket ChangeDevMode(PrintDialog pdialog, int prpty, DrawingVisual vis)
{
var queue = pdialog.PrintQueue;
var cvt = new PrintTicketConverter(queue.Name, PrintTicketConverter.MaxPrintSchemaVersion);
// Display dialog, don't make changes
var devmode1 = cvt.ConvertPrintTicketToDevMode(pdialog.PrintTicket, BaseDevModeType.UserDefault);
// Consistency check
var dmSize = BitConverter.ToInt16(devmode1, 68);
var dmDriverExtra = BitConverter.ToInt16(devmode1, 70);
if (devmode1[361] == 0)
{
devmode1[361] = 1;
}
return cvt.ConvertDevModeToPrintTicket(devmode1, PrintTicketScope.PageScope);
}
}
printdialog 中的值发生了变化,但仍然打印错误。更改不适用。欢迎任何帮助!
【问题讨论】:
-
不能自动画180度吗?
-
@DanielA.White 检查我的更新,希望这能让我更清楚为什么我需要访问它!
-
听起来像是 x-y 问题。
-
我的评论可能跑题了,但是当用户选择
Landscape或多个副本或选择反向顺序时,您是否显示MessageBox?可能您会找到解决方案,但试图满足这样的要求听起来很浪费时间。 -
如果我说它是关于一个标签打印机,所有东西都需要在一个 1 英寸的小正方形上打印,也许更有意义?如果用户不小心选中了该复选框,它将不再在标签上打印,而是在包含贴纸的纸上打印,如果这有意义的话