Win32prn com TS

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

chrissoares
Usuário Nível 1
Usuário Nível 1
Mensagens: 45
Registrado em: 23 Dez 2009 14:35
Localização: Belo Horizonte/MG
Contato:

Win32prn com TS

Mensagem por chrissoares »

Saudações,

Passei por um problema com impressão via Terminal Service utilizando a Win32prn e gostaria de compartilhar, para facilitar a vida de alguém algum dia.

Um cliente passou a utilizar meu sistema através de acesso via Terminal Service. Tudo estava funcionando bem no inicio dos testes em sua empresa, porém ao tentar imprimir em uma impressora Brother, a impressão saia cortada ao na parte Superior e lado Esquerdo. Quando realizei os teste no meu ambiente de trabalho, utilizando uma impressora Ricoh, a impressão saiu correta, sem nenhum corte.
Atualizei os drivers no computador do cliente e no servidor do TS, tentei todos os drivers disponíveis para Brother e nenhum resultado.
A solução foi alterar no código responsável pelas impressões, agradeço ao Vagucs que me forneceu a alguns anos este código.

Fazendo testes descobri que na impressora Ricoh, ao iniciar um novo documento de impressão, Win32prn:StartDoc, os valores para ::LeftMargin e ::TopMargin eram setados, ao utilizar a Brother estes valores ficavam com zero.

A Solução foi setar as margens (::LeftMargin e ::TopMargin) antes de chamar o método ::StartDoc.

Abaixo esta como ficou meu código para setar as margens:

Código: Selecionar todos

      //A Função recebe a impressora pelo parâmetro cPrinter.
      oPrinter:= Win32Prn():New(cPrinter)
      oPrinter:Landscape	:= FALSE //Layout Retrato
      oPrinter:FormType 	:= DMPAPER_A4 //Papel A4
      oPrinter:Copies		:= nNumCopias //Total de cópias
      if !oPrinter:Create()
         cMsg += "Ocorreu um erro ao tentar imprimir em "+cPrinter+".*"+;
                 "Verifique se a impressora esta disponível."
         exit
      else
         oPrinter:leftMargin		:= oPrinter:mm_To_PosX(9) //9 Milimetros
         oPrinter:topMargin		:= oPrinter:mm_To_PosY(9) //9 Milimetros
         if !oPrinter:startDoc(cRelatorio)
            cMsg += "Erro de comunicação com a impressora "+cPrinter+".*"+;
                    "Verifique se a impressora esta ligada ou se você tem"+; 
                    "permissão na rede para realizar impressões nesta impressora."
            exit
         endif
      endif
      //Código que faz a impressão...
O método ::mm_to_PosX e ::mm_to_PosY transforma o valor passado em milímetros para pixels, que é a unidade utilizada pela Win32prn para fazer a impressão.
No meu caso defini 9 Milímetros, podemos melhorar colocando uma condição para as margens forem Zero, então define. Ai vai a criatividade e necessidade de cada um.

Espero que alguém possa se beneficiar destas informações, e gostaria de lhe incentivar a compartilhar descobertas com todos nós. É ajudando ao grupo que poderemos nos desenvolver cada vez mais.

Abraços e Deus abençoe a todos nós!
Christiano R. Soares
Analista Desenvolvedor
www.bhdados.com.br

'Tudo o que fizerem, façam de todo o coração, como para o Senhor, e não para os homens, sabendo que receberão do Senhor a recompensa da herança. É a Cristo, o Senhor, que vocês estão servindo. '
Colossenses 3:23-24
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Win32prn com TS

Mensagem por Eolo »

O método ::mm_to_PosX e ::mm_to_PosY transforma o valor passado em milímetros para pixels, que é a unidade utilizada pela Win32prn para fazer a impressão. No meu caso defini 9 Milímetros, podemos melhorar colocando uma condição para as margens forem Zero, então define. Ai vai a criatividade e necessidade de cada um.
Eu levei um baile da Win32prn, até chegar no que segue.

Sim, ela usa pixels para trabalhar, só que o número de pixels depende do tamanho do documento e da resolução que vc definir, além de antes de tudo depender da capacidade da printer. Se vc iniciar um job com A3 e 1200x1200 pixels numa printer que só funciona Letter e até 300x300, eu acho que
vai dar algum problema...

Você mexeu nas margens, resolveu, mas quem sabe não era o caso de, lá no começo, antes de qq coisa, pedir pra Win32prn checar qual a capacidade real em pixels da impressora?

Eu, parei de usar os métodos mm_to_PosX etc. Achava uma solução pra printer X, mudava pra Y não funcionava mais. Abandonei e comecei a endereçar tudo em pixels. Fim da novela.
chrissoares
Usuário Nível 1
Usuário Nível 1
Mensagens: 45
Registrado em: 23 Dez 2009 14:35
Localização: Belo Horizonte/MG
Contato:

Win32prn com TS

Mensagem por chrissoares »

Ola Eolo!

Concordo com você sobre o número de pixels poder alterar, de acordo com o tamanho do papel e a qualidade da impressão.
Durante as pesquisas para achar uma solução para o meu problema, eu vi o tópico BMP na Win32Prn diferente em PDF e Impressora do colega Luciano Bonfim, ele explicou esta relação de Qualidade da impressão e Pixels. Foi uma falha minha deixar de informar que existe esta relação, que quando maior a qualidade maior a quantidade de pixels na impressão.
Eu posso estar equivocado, mas os métodos ::mm_to_PosX e ::mm_to_PosY levão em consideração o número de pixels segundo o tamanho do papel e a qualidade de impressão. Observei que no método Create da classe ele pega, além das margens, a relação de pixels por polegada.

Código: Selecionar todos

    ::PixelsPerInchY   := GetDeviceCaps(::hPrinterDC,LOGPIXELSY)
    ::PixelsPerInchX   := GetDeviceCaps(::hPrinterDC,LOGPIXELSX)
Nos métodos ::mm_to_PosX e ::mm_to_PosY utiliza a relação obtida anteriormente para chegar ao valor em pixels.

Código: Selecionar todos

METHOD MM_TO_POSX( nMm ) CLASS WIN32PRN
  RETURN( INT( ( ( nMM * ::PixelsPerInchX ) / MM_TO_INCH ) - ::LeftMargin ) )

METHOD MM_TO_POSY( nMm ) CLASS WIN32PRN
  RETURN( INT( ( ( nMM * ::PixelsPerInchY ) / MM_TO_INCH ) - ::TopMargin ) )
Bem, foi o que entendi mas conto com a analise de outros colegas para confirmar se isto procede realmente.

Obrigado Eolo pela informação, garanto que vai ajudar a outros a pesquisarem mais a fundo sobre o tema.

Abraços, Deus nos abençoe!
Christiano R. Soares
Analista Desenvolvedor
www.bhdados.com.br

'Tudo o que fizerem, façam de todo o coração, como para o Senhor, e não para os homens, sabendo que receberão do Senhor a recompensa da herança. É a Cristo, o Senhor, que vocês estão servindo. '
Colossenses 3:23-24
Responder