支持用户定义的纸张大小

重要

新式打印平台是 Windows 与打印机通信的首选方式。 建议使用 Microsoft 的 IPP 收件箱类驱动程序以及打印支持应用 (PSA) 来自定义 Windows 10 和 11 中的打印体验,以便进行打印机设备开发。

有关详细信息,请参阅新式打印平台打印支持应用设计指南

用户定义的纸张大小可以特定于单个打印服务器,通常针对特定应用程序进行自定义。 因此,它们通常称为自定义纸张大小。 系统管理员使用打印文件夹来定义自定义纸张大小。 如果打印机可以处理自定义纸张大小,供应商必须使用打印机的 GPD 文件来指定可接受的大小范围。

提供了两种方法来描述自定义纸张的可接受大小范围:

  • 可以显式指定大小范围。

  • 可以指定相对于打印机最大纸张大小的大小范围。

显式指定纸张大小范围

若要使用此方法,GPD 文件的 PaperSize 功能必须包含具有 CUSTOMSIZE 参数的 *Option 条目。 此条目必须包含以下选项属性:

*MinSize *MaxSize *MaxPrintableWidth *MinLeftMargin *TopMargin *BottomMargin *CenterPrintable? *CursorOrigin *Command 可以使用这些 GPD 条目仅为具有以下特征的打印机创建自定义纸张大小说明:

  • 打印机支持通过命令来显式选择自定义纸张大小(通常通过移动光标原点)。

  • 对于所有自定义纸张大小,光标原点保持不变,相对于纸张的左上角。 (这通常不适用于横向打印,或者对于中间送纸或右侧送纸的打印机。)

  • 顶部和底部边距独立于纸张大小。

  • 如果纸张宽度小于为 *MinLeftMargin 和 *MaxPrintableWidth 指定的值的总和,则没有右边距。 也就是说,打印机可以打印到纸张的右边缘。

如果使用标准变量表达式(通常包括 PhysPaperLength 和 PhysPaperWidth 变量),则可以在打印时计算命令参数(在 *Command 条目中指定)。 这些变量表示由应用程序指定的打印作业请求的实际纸张大小。

指定相对于打印机最大纸张大小的纸张大小范围

对于不支持显式指定自定义纸张大小范围所需特征的打印机,提供了一种替代方法,该方法指定相对于打印机最大纸张大小的纸张大小。

若要使用此方法,GPD 文件的 PaperSize 功能必须包含具有 CUSTOMSIZE 参数的 *Option 条目。 此条目必须包含以下选项属性:

*MinSize *MaxSize *MaxPrintableWidth *CustCursorOriginX *CustCursorOriginX *CustPrintableOriginX *CustPrintableOriginY *CustPrintableSizeX *CustPrintableSizeY *Command 当指定相对于打印机最大纸张大小的大小范围时,请使用以下对齐规则:

  • 对于左侧送纸打印机,必须对齐所有纸张大小的上边距和左边距。

  • 对于右侧送纸打印机,必须对齐所有纸张大小的上边距和右边距。

  • 对于中间送纸打印机,必须对齐所有纸张大小的上边距和顶部中心点。

涉及以下步骤:

  1. 确定打印机最大纸张大小的以下信息:

    • 选择最大纸张大小所需的命令。
    • 将用于最大纸张大小的 *PageDimensions、*CursorOrigin、*PrintableOrigin 和 *PrintableArea GPD 条目的值,就好像它们将包含在 GPD 文件中一样。 但是,实际上不会将这些条目放在文件中。
  2. 创建公式,指定或计算每个自定义纸张大小的以下信息,相对于打印机的最大纸张大小。

    • 每个纸张可打印区域的原点和大小。
    • 每个纸张的光标原点。

步骤 2 的公式必须是 CUSTOMSIZE 参数表达式,这些表达式指定为以下 GPD 条目的值:

*CustCursorOriginX *CustCursorOriginX *CustPrintableOriginX *CustPrintableOriginY *CustPrintableSizeX *CustPrintableSizeY

CUSTOMSIZE 选项还必须包含一个 *Command 条目,该条目指定选择最大打印机大小的命令。 针对所有自定义纸张大小以及为可打印区域和光标原点控件指定的公式发送此命令,其中打印机在实际纸张上打印,无论其大小如何。

示例计算

作为一个简单的示例,假设打印机支持页边距与最大纸张大小相同的自定义纸张大小。 涉及的步骤包括:

确定最大纸张大小的 *PageDimensions、*CursorOrigin、*PrintableOrigin 和 *PrintableArea 条目的值。 (请勿将这些条目放入 GPD 文件中。)

根据这些值确定每个最大纸张大小边距的宽度,如以下伪表达式所示:

LeftMarginWidth=*PrintableOrigin.x RightMarginWidth=*PageDimensions.x-*PrintableArea.x-LeftMarginWidthTopMarginWidth=*PrintableOrigin.y BottomMarginWidth=*PageDimensions.y-*PrintableArea.y-TopMarginWidth

在这些伪表达式中,.x 和 .y 表示每个条目的值的水平和垂直分量。 对于横向打印,请使用 *PrintableArea 和 *PrintableOrigin 的横向值。

现在创建伪表达式,用于指定或计算非标准纸张大小的可打印区域。

*CustPrintableOriginX: %d{LeftMarginWidth}

*CustPrintableOriginY: %d{TopMarginWidth}

*CustPrintableSizeX: %d{PhysPaperWidth-LeftMarginWidth-RightMarginWidth}

*CustPrintableSizeY: %d{PhysPaperLength-TopMarginWidth-BottomMarginWidth}

请注意,使用两个标准变量:PhysPaperWidth 和 PhysPaperLength。 在运行时,这些变量包含应用程序请求的实际纸张大小的长度和宽度。

请注意,无论是左侧送纸、右侧送纸还是中间送纸,这些伪表达式都有效。

将步骤 1 中确定的实际值插入这些表达式中以创建 GPD 条目。 示例:

*CustPrintableOriginX:  %d{300}
*CustPrintableOriginY:  %d{300}
*CustPrintableSizeX:   %d{PhysPaperWidth-600}
*CustPrintableSizeY:  %d{PhysPaperLength-600}

创建计算光标原点索引的伪表达式。 在以下伪表达式中,*CursorOrigin.x 和 *CursorOrigin.y 是最大纸张大小光标原点的值的水平和垂直分量的占位符。

对于左侧送纸打印机:

*CustCursorOriginX: %d{*CursorOrigin.x} *CustCursorOriginY: %d{*CursorOrigin.y} 对于右侧送纸打印机:

*CustCursorOriginX: %d{*CursorOrigin.x+PhysPaperWidth-*PageDimensions.x} *CustCursorOriginY: %d{*CursorOrigin.y} 对于中间送纸打印机:

*CustCursorOriginX: %d{*CursorOrigin.x+(PhysPaperWidth-PageDimensions.x)/2} *CustCursorOriginY: %d{*CursorOrigin.y} 将步骤 1 中确定的实际值插入这些表达式以创建 GPD 条目。 例如(对于中间送纸):

*CustCursorOriginX:  %d{((PhysPaperWidth-14040)/2)+300}
*CustCursorOriginY:   %d{180}

指定其余三个 GPD 条目(*MinSize、*MaxSize 和 *MaxPrintableWidth)的值。 为 *MaxPrintableWidth 指定的值实际上并不用于此方法,但分析程序要求此条目存在,因此其值可以设置为 1。

示例

以下示例 GPD 文件段描述了中间送纸打印机可接受的自定义纸张大小。 对于纵向模式,所有自定义纸张大小的所有边距大小均为 300 个主单元(1/4 英寸)。 对于横向模式,上边距和下边距为 240 个主单元,而左边距和右边距为 200 个主单元。

*Option: CUSTOMSIZE
{
  *rcNameID: =USER_DEFINED_SIZE_DISPLAY
  *MinSize: PAIR(4200,9000)
  *MaxSize: PAIR(14040, 21240)
  *MaxPrintableWidth: 14040
  *MinLeftMargin: 100
  *CenterPrintable?: FALSE
  *PageProtectMem: 1692
  *InsertBlock: =PaperConstraints
  *switch: Orientation
  {
    *case: PORTRAIT
    {
       *CustCursorOriginX:  %d{((PhysPaperWidth-14040)/2)+300}
       *CustCursorOriginY:   %d{180}
       *CustPrintableOriginX:  %d{300}
       *CustPrintableOriginY:  %d{300}
       *CustPrintableSizeX:   %d{PhysPaperWidth-600}
       *CustPrintableSizeY:  %d{PhysPaperLength-600}
       *Command: CmdSelect
       {
         *Order: DOC_SETUP.13
 *Cmd: "<1B>&l101a8c1e99F<1B>*p0x0Y<1B>*c0t8064x12528Y"
 }
    }
    *case: LANDSCAPE_CC90
    {
      *switch:  Option20
      {
      *% The 8100 rotates the landscape job 180 degrees if a stapler
      *% is attached, so the staple can be placed in the top left
      *% corner of the document. The printer always rotates the
      *% landscape job, even if stapling is not selected.
        *case: 3KStapler
        {
          *CustCursorOriginX:  %d{((PhysPaperWidth-14040)/2)+200}
          *CustCursorOriginY:   %d{PhysPaperLength}
          *CustPrintableOriginX:  %d{200}
          *CustPrintableOriginY:  %d{240}
          *CustPrintableSizeX:   %d{PhysPaperWidth-400}
          *CustPrintableSizeY:  %d{PhysPaperLength-480}
          *Command: CmdSelect
          {
            *Order: DOC_SETUP.13
            *Cmd: "<1B>&l101a8c1e63F<1B>*p0x0Y<1B>*c0t12456x8184Y"
          }
        }
        *case: MBM5S
        {
          *CustCursorOriginX:  %d{((PhysPaperWidth-14040)/2)+200}
          *CustCursorOriginY:   %d{PhysPaperLength}
          *CustPrintableOriginX:  %d{200}
          *CustPrintableOriginY:  %d{240}
          *CustPrintableSizeX:   %d{PhysPaperWidth-400}
          *CustPrintableSizeY:  %d{PhysPaperLength-480}
          *Command: CmdSelect
          {
            *Order: DOC_SETUP.13
            *Cmd: "<1B>&l101a8c1e63F<1B>*p0x0Y<1B>*c0t12456x8184Y"
          }
        }
        *default
        {
          *CustCursorOriginX:  %d{((PhysPaperWidth-14040)/2)+200}
          *CustCursorOriginY:   %d{21000}
          *CustPrintableOriginX:  %d{200}
          *CustPrintableOriginY:  %d{240}
          *CustPrintableSizeX:   %d{PhysPaperWidth-400}
          *CustPrintableSizeY:  %d{PhysPaperLength-480}
          *Command: CmdSelect
          {
            *Order: DOC_SETUP.13
 *Cmd: "<1B>&l101a8c1e63F<1B>*p0x0Y<1B>*c0t12456x8184Y"
 }
        }
      } *% switch Option20
    } *% case LANDSCAPE_CC90
  } *% switch Orientation
}