Поддержка определяемых пользователем размеров бумаги
Внимание
Современная платформа печати — это предпочтительный способ взаимодействия с принтерами Windows. Рекомендуется использовать драйвер класса "Входящие" Microsoft IPP вместе с приложениями поддержки печати (PSA), чтобы настроить возможности печати в Windows 10 и 11 для разработки устройств принтера.
Дополнительные сведения см. в статье "Современная платформа печати" и руководство по проектированию приложений поддержки печати.
Определяемые пользователем размеры бумаги могут быть связаны с одним сервером печати и обычно настраиваются для конкретного приложения. Поэтому они часто называются настраиваемыми размерами бумаги. Системные администраторы используют папку печати для определения настраиваемых размеров бумаги. Если принтер может обрабатывать настраиваемые размеры бумаги, поставщики должны использовать GPD-файл принтера, чтобы указать допустимый диапазон размеров.
Для описания допустимых диапазонов размеров для настраиваемой бумаги предоставляются два метода:
Можно явно указать диапазоны размеров.
Можно указать диапазоны размеров относительно самого большого размера бумаги принтера.
Явное указание диапазонов размеров бумаги
Чтобы использовать этот метод, функция PaperSize файла GPD должна включать запись *Option с аргументом CUSTOMSIZE. Эта запись должна содержать следующие атрибуты параметра:
*MinSize *MaxSize *MaxPrintableWidth *MinLeftMargin *TopMargin *BottomMargin *CenterPrintable? *CursorOrigin *Command Вы можете использовать эти записи GPD для создания настраиваемых описаний размера бумаги только для принтеров со следующими характеристиками:
Принтер поддерживает команды для явного выбора настраиваемых размеров бумаги (обычно путем перемещения источника курсора).
Источник курсора остается фиксированным относительно верхнего левого угла бумаги для всех настраиваемых размеров бумаги. (Обычно это не верно для печати в альбомном режиме или для принтеров, которые питаются в центре или правой рукой.)
Верхние и нижние поля не зависят от размера бумаги.
Если ширина бумаги меньше суммы значений, указанных для *MinLeftMargin и *MaxPrintableWidth, нет правого поля. То есть принтер может печатать на правом краю бумаги.
Параметры команд (указанные в записях команд) можно вычислить во время печати, если используются стандартные выражения переменных, обычно включая переменные PhysPaperLength и PhysPaperWidth. Эти переменные представляют фактический размер бумаги, запрошенный для задания печати, как указано приложением.
Указание диапазонов размеров бумаги относительно самого большого размера бумаги принтера
Для принтеров, которые не поддерживают характеристики, необходимые для указания настраиваемых диапазонов размеров бумаги явным образом, предоставляется альтернативный метод, который задает размеры бумаги относительно самого большого размера бумаги принтера.
Чтобы использовать этот метод, функция PaperSize файла GPD должна включать запись *Option с аргументом CUSTOMSIZE. Эта запись должна содержать следующие атрибуты параметра:
*MinSize *MaxSize *MaxPrintableWidth *CustCursorOriginX *CustCursorOriginX *CustPrintableOriginX *CustPrintableOriginY *CustPrintableSizeX *CustPrintableSizeY *Command При указании диапазона размера относительно наибольшего размера бумаги принтера используйте следующие правила выравнивания:
Для принтеров левого канала верхние и левые поля всех размеров бумаги должны быть выровнены.
Для принтеров правого канала необходимо выровнять верхние и правые поля всех размеров бумаги.
Для принтеров центрального канала верхние поля и верхние точки центра всех размеров бумаги должны быть выровнены.
Ниже приведены действия.
Определите следующие сведения для самого большого размера бумаги принтера:
- Команда, требуемая для выбора самого большого размера бумаги.
- Значения, которые будут использоваться для крупнейших записей размера бумаги *PageDimensions, *CursorOrigin, *PrintableOrigin и *PrintableArea GPD, как будто они будут включены в файл GPD. Однако на самом деле эти записи не будут размещаться в файле.
Создайте формулы, которые указывают или вычисляют следующие сведения для каждого настраиваемого размера бумаги относительно самого большого размера бумаги принтера.
- Источник и размер печатной области каждой бумаги.
- Источник курсора для каждой бумаги.
Формулы для шага 2 должны быть выражениями параметров CUSTOMSIZE, которые указываются в качестве значений для следующих записей GPD:
*CustCursorOriginX *CustCursorOriginX *CustPrintableOriginX *CustPrintableOriginY *CustPrintableSizeX *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-TopMarginWidthth
В этих псевдоэкспрессиях .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
}