支持用户定义的纸张大小

重要

建议使用 Microsoft 的 IPP 收件箱类驱动程序以及打印支持应用 (PSA) ,自定义 Windows 10 和 11 中的打印体验,以便进行打印机设备开发。

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

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

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

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

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

显式指定纸张大小范围

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

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

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

  • 对于所有自定义纸张大小,光标原点相对于纸张的左上角保持固定。 (对于横向模式打印或中心馈送或右手送纸的打印机,这通常不是这样。)

  • 上边距和下边距与纸张大小无关。

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

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

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

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

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

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

  • 对于左进纸打印机,所有纸张尺寸的上边距和左边距都必须对齐。

  • 对于右进纸打印机,所有纸张尺寸的上边距和右边距必须对齐。

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

涉及以下步骤:

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

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

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

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

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

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

示例计算

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

确定最大纸张尺寸的 *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
}