Partilhar via


Suporte a tamanhos de papel definidos pelo usuário

Importante

A moderna plataforma de impressão é o meio preferido do Windows para comunicar com as impressoras. Recomendamos que utilize o controlador de classe da caixa de entrada IPP da Microsoft, juntamente com as Aplicações de Suporte de Impressão (PSA), para personalizar a experiência de impressão no Windows 10 e 11 para o desenvolvimento de dispositivos de impressora.

Para obter mais informações, consulte Guia de design do aplicativo de suporte de impressão v1 e v2.

Os tamanhos de papel definidos pelo usuário podem ser específicos para um único servidor de impressão e normalmente são personalizados para uma aplicação específica. Por isso, eles são frequentemente chamados de tamanhos de papel personalizados. Os administradores de sistema usam a pasta de impressão para definir tamanhos de papel personalizados. Se uma impressora puder lidar com tamanhos de papel personalizados, os fornecedores deverão usar o arquivo GPD da impressora para especificar o intervalo aceitável de tamanhos.

Dois métodos são fornecidos para descrever intervalos de tamanho aceitáveis para papel personalizado:

  • Você pode especificar intervalos de tamanho explicitamente.

  • Você pode especificar intervalos de tamanho em relação ao maior tamanho de papel da impressora.

Especificando intervalos de tamanho de papel explicitamente

Para usar esse método, o recurso PaperSize do arquivo GPD deve incluir uma entrada *Option com um argumento CUSTOMSIZE. Esta entrada deve conter os seguintes atributos de opção:

*MinSize *MaxSize *MaxPrintableWidth *MinLeftMargin *TopMargin *BottomMargin *CenterPrintable? *CursorOrigin *Command Você pode usar essas entradas GPD para criar descrições personalizadas de tamanho de papel apenas para impressoras com as seguintes características:

  • A impressora suporta comandos para selecionar explicitamente tamanhos de papel personalizados (normalmente movendo a origem do cursor).

  • A origem do cursor permanece fixa, em relação ao canto superior esquerdo do papel, para todos os tamanhos de papel personalizados. (Isso normalmente não é verdade para impressão em modo paisagem ou para impressoras que são alimentadas pelo centro ou pelo lado direito.)

  • As margens superior e inferior são independentes do tamanho do papel.

  • Se a largura do papel for menor que a soma dos valores especificados para *MinLeftMargin e *MaxPrintableWidth, não haverá margem direita. Ou seja, a impressora pode imprimir na borda direita do papel.

Os parâmetros de comando (especificados nas entradas de Comando *) podem ser calculados no momento da impressão se forem usadas expressões de variáveis padrão , que normalmente incluem as variáveis PhysPaperLength e PhysPaperWidth. Essas variáveis representam o tamanho real do papel solicitado para o trabalho de impressão, conforme especificado por um aplicativo.

Especificar intervalos de tamanho de papel relativos ao maior tamanho de papel da impressora

Para impressoras que não suportam as características necessárias para especificar intervalos de tamanho de papel personalizados explicitamente, um método alternativo é fornecido, que especifica os tamanhos de papel em relação ao maior tamanho de papel da impressora.

Para usar esse método, o recurso PaperSize do arquivo GPD deve incluir uma entrada *Option com um argumento CUSTOMSIZE. Esta entrada deve conter os seguintes atributos de opção:

*MinSize *MaxSize *MaxPrintableWidth *CustCursorOriginX *CustCursorOriginX *CustPrintableOriginX *CustPrintableOriginY *CustPrintableSizeX *CustPrintableSizeY *Command Ao especificar um intervalo de tamanhos em relação ao maior tamanho de papel da impressora, use as seguintes regras de alinhamento:

  • Para impressoras de alimentação lateral esquerda, as margens superior e esquerda de todos os tamanhos de papel devem estar alinhadas.

  • Para impressoras de alimentação direita, as margens superior e direita de todos os tamanhos de papel devem estar alinhadas.

  • Para impressoras de alimentação central, as margens superiores e os pontos centrais superiores de todos os tamanhos de papel devem estar alinhados.

Estão envolvidas as seguintes etapas:

  1. Determine as seguintes informações para o maior tamanho de papel da impressora:

    • O comando necessário para selecionar o maior tamanho de papel.
    • Valores que seriam usados para as entradas *PageDimensions, *CursorOrigin, *PrintableOrigin e *PrintableArea GPD do maior tamanho de papel, como se fossem ser incluídas no arquivo GPD. No entanto, você não vai realmente colocar essas entradas no arquivo.
  2. Crie fórmulas que especifiquem ou calculem as seguintes informações para cada tamanho de papel personalizado, em relação ao maior tamanho de papel da impressora.

    • A origem e o tamanho da área imprimível de cada papel.
    • A origem do cursor para cada papel.

Em relação à etapa 2, as fórmulas devem ser expressões do parâmetro CUSTOMSIZE , especificadas como valores para as seguintes entradas GPD:

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

A opção CUSTOMSIZE também deve incluir uma entrada *Command que especifica o comando que seleciona o maior tamanho da impressora. Este comando é enviado para todos os tamanhos de papel personalizados e as fórmulas especificadas para a área imprimível e o controle de origem do cursor onde a impressora imprime no papel real, independentemente do seu tamanho.

Cálculos de exemplo

Como um exemplo simples, suponha que sua impressora ofereça suporte a tamanhos de papel personalizados que tenham margens do mesmo tamanho que as margens do tamanho de papel maior. As etapas envolvidas são:

Determine os valores para as entradas de *PageDimensionsdo tamanho de papel maior, *CursorOrigin, *PrintableOrigine *PrintableArea. (Não coloque essas entradas no arquivo GPD.)

Determine a largura de cada uma das margens do maior tamanho de papel em termos desses valores, conforme ilustrado nas seguintes pseudoexpressões:

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

Nessas pseudoexpressões, .x e .y representam os componentes horizontais e verticais do par valor de cada entrada. Para impressão no modo paisagem, utilize os valores de paisagem para *PrintableArea e *PrintableOrigin.

Agora crie pseudoexpressões que especificam ou calculam as áreas imprimíveis para tamanhos de papel não padrão.

*CustPrintableOriginX: %d{LeftMarginWidth}

*CustPrintableOriginY: %d{TopMarginWidth}

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

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

Observe o uso das duas variáveis padrão, PhysPaperWidth e PhysPaperLength. Em tempo de execução, essas variáveis contêm o comprimento e a largura do tamanho real do papel que foi solicitado por um aplicativo.

Observe que essas pseudoexpressões são válidas quer o papel seja alimentado à esquerda, à direita ou ao centro.

Insira valores reais, determinados na etapa 1, nessas expressões para criar entradas GPD. Exemplos podem ser:

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

Crie pseudoexpressões que calculem os índices de origem do cursor. Nas pseudoexpressões a seguir, *CursorOrigin.x e *CursorOrigin.y são marcadores de posição para os componentes horizontais e verticais do valor do par na origem do cursor do maior tamanho de papel.

Para impressoras com alimentação à esquerda:

*CustCursorOriginX: %d{*CursorOrigin.x} *CustCursorOriginY: %d{*CursorOrigin.y} Para impressoras com alimentação direita:

*CustCursorOriginX: %d{*CursorOrigin.x+PhysPaperWidth-*PageDimensions.x} *CustCursorOriginY: %d{*CursorOrigin.y} Para impressoras com alimentação central:

*CustCursorOriginX: %d{*CursorOrigin.x+(PhysPaperWidth-PageDimensions.x)/2} *CustCursorOriginY: %d{*CursorOrigin.y} Insira valores reais, determinados na etapa 1, nessas expressões para criar entradas GPD. Exemplos podem ser (para papel alimentado ao centro):

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

Especifique valores para as três entradas GPD restantes--*MinSize, *MaxSize, e *MaxPrintableWidth. O valor especificado para *MaxPrintableWidth não é realmente usado para esse método, mas o analisador requer que a entrada exista, para que seu valor possa ser definido como 1.

Exemplo

O exemplo de segmento de arquivo GPD a seguir descreve tamanhos de papel personalizados aceitáveis para uma impressora alimentada por centro. Para o modo retrato, todas as margens para todos os tamanhos de papel personalizados são de 300 unidades mestras (1/4 polegada) de tamanho. Para o modo paisagem, as margens superior e inferior são de 240 unidades mestras, enquanto as margens esquerda e direita são de 200 unidades mestras.

*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
}