支援使用者定義的紙張大小
重要
新式列印平臺是 Windows 與印表機通訊的慣用方法。 我們建議您使用Microsoft的 IPP 收件匣類別驅動程式,以及列印支援應用程式 (PSA),自定義 Windows 10 和 11 中的列印體驗,以進行印表機裝置開發。
如需詳細資訊,請參閱 新式列印平臺 和 列印支援應用程式設計指南。
用戶定義的紙張大小可以是單一列印伺服器特有的,而且通常會針對特定應用程式自定義。 因此,它們通常稱為自定義紙張大小。 系統管理員會使用列印資料夾來定義自訂紙張大小。 如果印表機可以處理自定義紙張大小,廠商必須使用印表機的 GPD 檔案來指定可接受的大小範圍。
提供兩種方法來描述自定義紙張可接受的大小範圍:
您可以明確指定大小範圍。
您可以指定相對於印表機最大紙張大小的大小範圍。
明確指定紙張大小範圍
若要使用此方法,GPD 檔案的 PaperSize 功能必須包含具有 CUSTOMSIZE 自變數的 *Option 專案。 這個項目必須包含下列選項屬性:
*MinSize *MaxSize *MaxPrintableWidth *MinLeftMargin *TopMargin *BottomMargin *CenterPrintable? *CursorOrigin *命令 您可以使用這些 GPD 專案,只針對具有下列特性的印表機建立自定義紙張大小描述:
印表機支援命令來明確選取自定義紙張大小(通常是移動游標原點)。
相對於紙張左上角,數據指標原點會維持固定,適用於所有自定義紙張大小。 (這通常不適用於橫向模式列印,或用於置中送或右送的印表機。
上邊界和下邊界與紙張大小無關。
如果紙張寬度小於為 *MinLeftMargin 和 *MaxPrintableWidth 指定的值總和,則沒有右邊界。 也就是說,印表機可以列印到紙張的右邊緣。
如果使用標準變數表示式,可以在列印時間計算命令參數(如 *Command 專案所指定),通常包括 PhysPaperLength 和 PhysPaperWidth 變數。 這些變數代表針對列印作業所要求的實際紙張大小,如應用程式所指定。
指定相對於印表機最大紙張大小的紙張大小範圍
對於不支持明確指定自定義紙張大小範圍所需特性的印表機,會提供替代方法,這個方法會指定相對於印表機最大紙張大小的紙張大小。
若要使用此方法,GPD 檔案的 PaperSize 功能必須包含具有 CUSTOMSIZE 自變數的 *Option 專案。 這個項目必須包含下列選項屬性:
*MinSize *MaxSize *MaxPrintableWidth *CustCursorOriginX *CustCursorOriginX *CustPrintableOriginX *CustPrintableOriginY *CustPrintableSizeX *CustPrintableSizeY *Command 指定相對於打印機最大紙張大小的大小範圍時,請使用下列對齊規則:
對於左紙印表機,所有紙張大小的上邊界和左邊界必須對齊。
對於右饋印表機,所有紙張大小的上邊界和右邊界必須對齊。
對於置中摘要印表機,所有紙張大小的上邊界和上置中心點必須對齊。
下列步驟涉及:
判斷印表機最大紙張大小的下列資訊:
- 選取最大紙張大小所需的命令。
- 將用於最大紙張大小的 *PageDimensions、*CursorOrigin、*PrintableOrigin 和 *PrintableArea GPD 專案的值,就好像它們要包含在 GPD 檔案中一樣。 不過,您實際上不會將這些專案放在 檔案中。
建立公式,指定或計算每個自定義紙張大小的下列資訊,相對於印表機的最大紙張大小。
- 每個紙張可列印區域的原點和大小。
- 每個紙張的數據指標原點。
步驟 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
在這些 pseudoexpressions 中,.x 和 .y 代表每個專案 配對 值的水準和垂直元件。 針對橫向列印,請使用 *PrintableArea 和 *PrintableOrigin 的橫向值。
現在建立 pseudoexpression,以指定或計算非標準紙張大小的可列印區域。
*CustPrintableOriginX: %d{LeftMarginWidth}
*CustPrintableOriginY: %d{TopMarginWidth}
*CustPrintableSizeX: %d{PhysPaperWidth-LeftMarginWidth-RightMarginWidth}
*CustPrintableSizeY: %d{PhysPaperLength-TopMarginWidth-BottomMarginWidth}
請注意,使用兩個標準變數 PhysPaperWidth 和 PhysPaperLength。 在運行時間,這些變數包含應用程式所要求的實際紙張大小長度和寬度。
請注意,無論紙張是左送、右送或中送,這些虛擬expression 都是有效的。
將步驟 1 中決定的實際值插入這些運算式中,以建立 GPD 專案。 範例可能是:
*CustPrintableOriginX: %d{300}
*CustPrintableOriginY: %d{300}
*CustPrintableSizeX: %d{PhysPaperWidth-600}
*CustPrintableSizeY: %d{PhysPaperLength-600}
建立可計算數據指標源索引的 pseudoexpression。 在下列 pseudoexpressions 中,*CursorOrigin.x 和 *CursorOrigin.y 是最大紙張大小游標原點之 配對 值之水準和垂直元件的位置持有者。
針對左送印表機:
*CustCursorOriginX: %d{*CursorOrigin.x} *CustCursorOriginY: %d{*CursorOrigin.y} 適用於右送印表機:
*CustCursorOriginX: %d{*CursorOrigin.x+PhysPaperWidth-*PageDimensions.x} *CustCursorOriginY: %d{*CursorOrigin.y} 適用於 center-fed 列印機:
*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
}