Problemas na Impressão

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

Moderador: Moderadores

locio
Usuário Nível 2
Usuário Nível 2
Mensagens: 98
Registrado em: 27 Out 2006 14:21

Problemas na Impressão

Mensagem por locio »

Fiz um programa para imprimir Termo de Rescisão e utilizo muito os comandos, do tipo:

oPrinter:Box ( 90, 2005, 4810, 2100 )
oPrinter:FillRect (100, 2015, 4800, 2095, CINZA )

oPrinter:SetPrc(oPrinter:Prow()+1, 30 )
oPrinter:SetFont('Arial',7,{1,12}, 700, .F., .F.)
oprinter:setcolor(BLACK,CINZA)

CTEXTO = 'DADOS DO CONTRATO'
oPrinter:TextOut( cTEXTO, .F. )

Fiz o programa testei e deu tudo certo. Imprimir no pdfcreator sem problemas, mas quando mandei imprimir direto pra impressora HP Laserjet P1102w saiu tudo desconfigurado.

Vocês podem me ajudar.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Problemas na Impressão

Mensagem por Eolo »

As coordenadas que vão em cada função, por ex oPrinter:Box ( 90, 2005, 4810, 2100 ), são em pixels, e elas têm que ser proporcionais ao tamanho da folha (em pixels) e também ao modo de impressão (rascunho, normal etc.).

Dá uma olhada no tópico https://pctoledo.org/forum/viewto ... els#p74185.

Nesse exemplo, eu defino o modo rascunho com oPrinter:setPrintQuality(-1) e o tamanho do papel A4 com oPrinter:formtype(9).
Mais à frente, a função PIX define quais coordenadas usar, dependendo do modo.

Em resumo: no modo rascunho, são MENOS pixels por folha do que no modo ótimo. A posição 500, em rascunho, sai no meio da página (só como exemplo). A mesma posição 500, em modo ótimo, fica do lado esquerdo... Se você constrói o relatório com os coordenadas em pixels para modo rascunho e manda imprimir em modo ótimo, não sai mesmo do jeito desejado.


Em tempo: note que uso as funções oprinter:pagewidth e oprinter:pageheight, as quais capturam a largura e a altura do papel, em pixels, dependendo do tamanho e modo de impressão escolhidos antes.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Problemas na Impressão

Mensagem por Eolo »

Pra ajudar a clarear a coisa, os objetos oprinter:pagewidth (largura) e oprinter:pageheight (altura) retornam os seguintes valores EM PIXELS para uma folha A4 e uma impressora HP F4180, dependendo do modo:
-1 = 2480 e 3507 (rascunho)
-2 = 4960 e 7015
-3 = 7440 e 14031
-4 = 9921 e 14031 (ótima)

a) esses são valores na orientação RETRATO. Se alterar pra paisagem (o objeto LANDSCAPE), os valores ficam invertidos.

b) se vc quiser imprimir uma linha horizontal preenchendo todo o papel, então o tamanho em pixels vai ter que ser 2480, 4960, 7440 ou 9921, dependendo do modo.

c) esses valores variam um pouco dependendo da impressora. Por isso, fiz (abs(int(lar/1)-2480)<20) .and. (abs(int(alt/1)-3507)<20) na função PIX, ou seja, para aceitar uma variação de até 20 pixels.

d) note que há as margens não imprimíveis, que também dependem da impressora. Os objetos topmargin, bottommargin, leftmargin e rightmargin (acima, abaixo, esquerda, direita) retornam o número de pixels das margens em cada caso, onde nada pode ser impresso. Se vc imprimir "A" no pixel 50, em modo -4, esse "A" não vai ser impresso (e sem aviso prévio).

Pode parecer óbvio, mas aqui vai uma informação: uma impressão em modo rascunho sai mais "fraca" exatamente porque são menos pixels impressos (por isso gasta menos tinta). É como se ficassem espaços em branco entre os pixels impressos. Já no modo ótimo, gasta mais tinta porque são impressos mais pixels, fica mais "forte" porque não ficam espaços em branco. Quer conferir? Examine com uma LUPA algo impresso nos dois modos. No modo rascunho, dá pra ver os "vazios"...

O mesmo acontece com as cores. A impressora só usa vermelho, azul, amarelo e preto, então quando vc imprime algo em marrom, a impressora mescla pixels das cores básicas, de tal forma que nossos olhos "enxergam" o marrom. Com a lupa, dá pra ver isso claramente. Ah, idem com os tons de cinza. No preto "chapado", não há espaços em branco. No cinza claro, com poucos pixels impressos, enxergamos "cinza". Em outras palavras: o cinza não existe. Nossos olhos enxergam cinza porque a imagem é uma mistura de preto e branco.
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Problemas na Impressão

Mensagem por Imatech »

Olá Eolo !



Poderia nos nos fornecer um exemplo prático ( .prg ) para impressão que funcione em qualquer impressora, como na soliciatação do "Locio" impressão de quadros do TRCT ( box ) onde se utilizem todas as margens do tipo de papel utilizado ( formularios em geral, com texto tambem disperso em todas as marges )...



Abc...
M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Problemas na Impressão

Mensagem por Eolo »

A resposta é simplesmente fazer as coordenadas (em pixels) variarem de acordo com a impressora e o modo de impressão. É o que eu fiz com a função PIX e a variável PIX (veja no link que citei acima).

Primeiro vc desenha o seu formulário, digamos setando papel A4 e modo rascunho, e define a posição do box: oPrinter:box(90, 2005, 4810, 2100)

Agora, vc inclui a função PIX, a qual vai atribuir de 1 a 4 à variável PIX, usando o formato e modo escolhidos, e as resultantes largura e altura em pixels. Aliás, a função PIX só considera papel A4, retrato e paisagem. Não me preocupei com outros formatos porque não precisei. Mas isto pode ser facilmente complementado.

Bem, se a largura e altura forem 2480 e 3507 (com uma variação de 20 pixels pra cima ou pra baixo), vc setou o modo Rascunho, aí a variável PIX recebe 1. Se, no outro extremo, a largura e altura forem 99921 e 14031, vc setou o modo Ótimo, aí PIX recebe 4.

(esses valores são padrões, achei meio na “unha”, testando cada uma das opções e ainda me valendo do Corel Draw e outros soft, além de pesquisa na net. A variação de 20 pixels eu considerei porque algumas impressoras – caso de uma HP Laser – usam números um pouco diferentes.)

Finalmente, é só alterar o objeto para:
oPrinter:box(90*PIX, 2005*PIX, 4810*PIX, 2100*PIX)

Dependendo do valor de PIX (1 a 4), o primeiro argumento vai virar 90, 180, 270 ou 360. Seja qual for o modo de impressão, o box vai sair sempre na mesma posição do papel.

O que faltou no PRG do Locio:

a) definir o modo de impressão: oPrinter:setPrintQuality(qualidade)
(onde qualidade varia de -1 rascunho até -4 ótima)

b) definir o tamanho do papel: oPrinter:formtype(9) // A4

c) baseado em A e B, e ainda na impressora que foi selecionada, obter a largura e altura em pixels: oprinter:pagewidth e oprinter:pageheight

d) usar a função PIX

Um outro objeto que pode ser necessário usar é o oprinter:setbkmode(1). Seguinte: quando vc imprime qualquer coisa, vai sempre uma “moldura” opaca em volta. Se vc imprimir um BOX e depois um texto bem encostada no BOX, a moldura desse texto vai se sobrepor ao BOX, que sai sair com falha. Usando o oprinter:setbkmode(1), essa moldura fica TRANSPARENTE, aí vc pode encostar as duas imagens sem problema.

Quanto às margens, eu pelo menos só me preocupo com elas na hora de desenhar o formulário. Depois, não há o que mexer. Em outras palavras: se o Locio, ao desenhar o formulário dele, considerou 90 como a posição inicial adequada do BOX, não tem o que alterar depois, certo? Esse número só vai variar em função do modo, mas isso vai estar cercado pela função PIX.

Se ele tentou colocar 20 ao invés de 90 e não imprimiu, é porque esse 20 está na área não imprimível... Aliás, não entendi o que você quis dizer com “texto também disperso em todas as margens”. Até onde eu sei, existe uma área (nas margens) onde não dá pra imprimir. Algumas impressoras “industriais” ainda conseguem usar a área total do papel, mas não é o caso de impressoras comuns. Se for um formulário dinâmico, é só usar os objetos topmargin, leftmargin etc. Quando chegar no limite, newpage!
Responder