Estou tentando determinar os tamanhos reais de mídia (Carta, A4, etc.) suportados por uma impressora usando a API do Win32 (Winspool). De acordo com a documentação, EnumForms
ela enumera os formatos (tamanhos de mídia) suportados por uma impressora, mas, para todas as impressoras, retorna todos os formulários registrados no computador.
DeviceCapabilities
pode retornar três informações diferentes relacionadas aos tamanhos de mídia:
DC_PAPERNAMES
retorna os nomes de todos os tamanhos de mídia suportados por uma impressora, mas esses nomes não correspondem aos nomes dos formulários retornados por EnumForms
. Além disso, os nomes dos formulários estão sempre em inglês e, portanto, não correspondem de forma alguma aos DC_PAPERNAMES
retornados para outros idiomas.
DC_PAPERSIZE
retorna os tamanhos de todas as mídias suportadas por uma impressora, mas esses tamanhos não correspondem exatamente aos tamanhos nos formulários retornados por EnumForms
. Além disso, não há informações de margem.
DC_PAPERS
retorna o valor dmPaperSize do Windows para cada tamanho de mídia suportado. No entanto, não parece haver nenhuma maneira de determinar o formato correspondente.
Como posso obter os valores dos tamanhos de mídia realmente suportados (como form_info_X)?
Para obter informações de tamanho para cada tamanho de mídia, primeiro é necessário obter todos os tamanhos suportados pela impressora. Isso pode ser obtido solicitando o recurso DC_PAPERS chamando DeviceCapabilities. Os valores retornados são os mesmos usados no campo dmPaperSize da estrutura DEVMODE. Mais sobre isso em breve. Embora os Device Capabilities possam ser usados para recuperar os nomes de papel (DC_PAPERNAMES) e os tamanhos de papel (DC_PAPERSIZE), não os queremos porque os nomes de papel são específicos de localidade e não podemos ter certeza do que é retornado para tamanhos de papel personalizados. Da mesma forma, mais de um tamanho de mídia pode ter o mesmo tamanho de papel físico, que é tudo o que é retornado por DC_PAPERSIZE. DC_PAPERS retorna uma lista de números que usaremos para recuperar as informações de tamanho de papel para cada impressora.
GetDeviceCaps pode ser usado para recuperar o tamanho físico da mídia (largura e altura), a área de imagem (novamente largura e altura) e o deslocamento do canto superior esquerdo da área de impressão (x e y) do tamanho de mídia definido atualmente. A partir desses valores, é possível calcular as margens para o tamanho do papel.
Portanto, para obter todas as informações de tamanho de mídia para um tamanho de papel, é necessário definir a mídia da impressora para o tamanho de mídia (tamanho do papel) para o qual queremos as informações de tamanho e, em seguida, chamar GetDeviceCaps para recuperar as informações de tamanho para esse tamanho de papel.
Definir o tamanho de papel atual para uma impressora é um processo de duas etapas. As etapas pressupõem que já recuperamos as informações PRINTER_INFO_8 da impressora. Outras estruturas PRINTER_INFO também podem ser usadas, desde que contenham a estrutura DEVMODE.
Feito isso, chame GetDeviceCaps várias vezes para recuperar cada uma das seguintes informações: PHYSICALWIDTH, PHYSICALHEIGHT, OFFSETX, OFFSETY, HORZRES E VERTRES.
Para recuperar as informações de tamanho de cada tamanho de mídia, basta repetir esse processo para cada valor DC_PAPERS.