【问题标题】:Find a printer's default duplexing option查找打印机的默认双面打印选项
【发布时间】:2012-04-04 19:56:11
【问题描述】:

对于给定打印文档的PrintSettingsDuplex 值可能(并且很可能)设置为Duplex.Default

我如何确定这是否意味着所选的打印机会或不会进行双面打印?

如何找到已安装打印机的支持行为的默认值?

【问题讨论】:

  • 我试图想象为什么它会很重要,但失败了。
  • @Damien_The_Unbeliever - 我们正在尝试将一系列文档合并到一个文档中,以便在单个打印作业中进行打印。但是,我们需要注意将在该打印作业上发生的双面打印选项,以便能够适当地分离文档,以便每个文档从新页面开始(而不是在另一个文档的背面)。
  • 您不能确保每个文档都可以被 2 整除吗?如果其页数为奇数,则添加一个空白页。然后它将永远不会打印在另一个文档页面的背面。
  • 那么你并不真正关心双工与否。不久前我实际上遇到了一个类似的用例,但对我来说,它是关于正确装订的。源位于链接中,您可以忽略 Reporting Services 部分。 theruntime.com/blogs/jacob/archive/2007/12/07/…
  • Here 是关于识别双工设置为 true 的文档的问题。

标签: c# .net printing duplex printer-properties


【解决方案1】:

我不确定您能否获得给定打印机的默认值。但是,如果您有创意,您可以获得实际的当前值。但是,如果您想确保您拥有正确的信息,您将不得不了解 DEVMODE 结构。这不是一个简单的操作,需要一些花哨的Win32 fu。这改编自几个来源,但适用于我的(诚然参差不齐的)测试。

[DllImport("kernel32.dll")]
static extern bool GlobalFree(IntPtr hMem);

[DllImport("kernel32.dll")]
public static extern IntPtr GlobalLock(IntPtr handle);

[DllImport("kernel32.dll")]
public static extern IntPtr GlobalUnlock(IntPtr handle);

private static short IsPrinterDuplex(string PrinterName)
{
    IntPtr hDevMode;                        // handle to the DEVMODE
    IntPtr pDevMode;                        // pointer to the DEVMODE
    DEVMODE devMode;                        // the actual DEVMODE structure

    PrintDocument pd = new PrintDocument();
    StandardPrintController controller = new StandardPrintController();
    pd.PrintController = controller;

    pd.PrinterSettings.PrinterName = PrinterName;

    // Get a handle to a DEVMODE for the default printer settings
    hDevMode = pd.PrinterSettings.GetHdevmode();

    // Obtain a lock on the handle and get an actual pointer so Windows won't
    // move it around while we're futzing with it
    pDevMode = GlobalLock(hDevMode);

    // Marshal the memory at that pointer into our P/Invoke version of DEVMODE
    devMode = (DEVMODE)Marshal.PtrToStructure(pDevMode, typeof(DEVMODE));

    short duplex = devMode.dmDuplex;

    // Unlock the handle, we're done futzing around with memory
    GlobalUnlock(hDevMode);

    // And to boot, we don't need that DEVMODE anymore, either
    GlobalFree(hDevMode);

    return duplex;
}

我使用了 pinvoke.net 中的 DEVMODE structure 定义。请注意,pinvoke.net 上定义的字符集可能需要根据 B0bi 在original link 上的 cmets 进行一些调整(即,在 DEVMODE 的 StructLayoutAttriute 中设置 CharSet = CharSet.Unicode)。您还需要DM enum。并且不要忘记使用 System.Runtime.InteropServices 添加;

您应该能够从这里缩小打印机设置的变化范围。

【讨论】:

    【解决方案2】:

    简短回答?你没有。不管各种设置说什么,实际的打印机可能被设置为始终双面打印作业。

    我不完全确定您打算如何将文档合并在一起,但听起来您可以简单地计算页数并选择在文档之间插入空白页,以确保每个新文档都从奇数页开始。

    这是一个更大的变化,但如果您愿意迁移到 XPS 工作流程,则有一个名为 PageForceFrontSide 的页面级工单项目将保证文档不会被错误地粘在一起。

    【讨论】:

      【解决方案3】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      相关资源
      最近更新 更多