![]() |
Tcl/Tk
Curso On-Line de Programação |
Imprimindo
Até bem pouco tempo só era possível imprimir, a partir de programas em Tcl/Tk, em ambiente UNIX. Isso porque não havia qualquer biblioteca de impressão para Windows ou MacOS.
Recentemente, alguns programadores começaram a desenvolver um sistema de impressão único para UNIX, Windows e MacOS. Esta solução, contudo, não é definitiva, pois a Ajuba Solutions está desenvolvendo seu próprio sistema de impressão, que deverá ser liberado em meados de outubro de 2000.
Nesta aula veremos como imprimir no Linux( UNIX ) e Windows. Começaremos com o Windows, pois envolve a utilização de bibliotecas externas. Mas adiante veremos como imprimir em ambiente UNIX.
Imprimindo em ambiente Windows
Antes que possamos prosseguir, faça o download dos pacotes de impressão para Windows. Caso esteja utilizando a versão 8.2 do Tcl/TK, baixe os seguintes arquivos, do meu site, http://www.souzamonteiro.com/download_freeware.shtml:
Para acrescentar a funcionalidade de impressão aos seu programas em Tcl/Tk para Windows, inclua as seguintes linhas no início de seus programas:
package require printer
package require gdiA seguir são apresentados os principais comandos suportados pelo pacote printer. Os mesmos comandos são válidos para o MacOS( arquivo printMac.c incluído nos fontes do pacote prnt823.zip ) e o UNIX( baixe o pacote printUnix.tar.gz ):
| Comando | Descrição |
| printer attr [-hDChdc] [-get {atributo1 atributo2...}|-set {{atributo1valor} {atributo2 valor}...}|-delete {atributo1atributo2...}] | Retorna, configura ou remove os atributos e valores especificados. -get retorna a lista de atributos: {{atributo valor}...}. -set configura os atributos especificados. -delete remove os atributos especificados. |
| printer close [-hDC hdc] | Fecha a impressora e libera o DC, concluindo os trabalhos( jobs ) pendentes. |
| printer dialog [-hDC hdc] [select|page_setup] [-flags flag] | Exibe a caixa de diálogo especificada: select, para caixa de seleção de impressora; page_setup, para caixa de configuração de impressora. |
| printer job [-hDC hdc] [start|end] | Inicia ou finaliza um trabalho de impressão. |
| printer list [-match string] [-verbose] | Retorna uma lista de todas as impressoras que correspondem a string, se for fornecida. Se -verbose for utilizado, inclui informações adicionais sobre as impressoras. |
| printer open [-name nome_da_impressora] [-default] [-attr {{atributo valor}...}] | Abre a impressora e retorna o hdc. |
| printer option [opção valor] ... | Obtem ou configura opções. |
| printer page [-hDChdc] [start|end] | Inicia ou finaliza uma página. |
| printer send [-postscript|-nopostscript] [-hDC hdc] [-printer nome_da_impressora] [-file nome_de_arquivo|-data dados] | Envia um arquivo no formato "raw" para a impressora. -postscript, significa que o arquivo está em formato ASCII; -nopostscript, significa que o arquivo está em formato binário. |
| printer version | Retorna a versão do pacote. |
Em ambiente UNIX o pacote printer, simulará um hdc.
Os comandos a seguir são exclusivos
para ambiente Windows, e constituem a interface GDI:
| Comando | Descrição |
| gdi arc hdcx1 y1 x2 y2 -extent graus -fillcor-outline cor -outlinestipple bitmap -start graus-stipple bitmap-style [pieslice|chord|arc] -width largura_da_linha | Semelhante ao widget canvas: desenha um arco. |
| gdi bitmap hdc x y -anchor [center|n|e|s|w] -background cor -bitmapbitmap-foreground cor | Desenha um bitmap X11. |
| gdi characters hdc [-font fonte] [-array vetor] | Cria um vetor com as larguras dos caracteres, no dispositivo ou fonte selecionada. |
| gdi copybits hdc [-window w|-screen] [-client] [-source "a b c d"] [-destination "a b c d"] -scale número -calc | Copia uma janela, uma área de uma janela w ou a tela inteira para o hdc de destino. |
| gdi image hdc x y -anchor [center|n|e|s|w] -image nome | Desenha uma imagem colorida, que tenha sido criada com o comando image de Tk. |
| gdi line hdc x1 y1... xn yn -arrow [first|last|both|none] -arrowshape {d1 d2 d3} -capstyle [butt|projecting|round] -fill cor -joinstyle [bevel|miter|round] -smooth [true|false] -splinestepsnúmero -stipple bitmap -widthlargura_da_linha | Semelhante ao widget canvas: desenha uma linha. |
| gdi map hdc [-logical x[y]] [-physical x[y]] [-offset {x y}] [-default] [-mode modo] | Modifica o modo de mapeamento do dispositivo de contexto. Os modos suportados são os mesmos da API do Windows: MM_HIENGLISH( polegadas ), MM_LOENGLISH, MM_HIMETRIC( milímetros ), MM_LOMETRIC, MM_TWIPS( twips ). |
| gdi oval hdc x1y1x2y2-fillcor-outlinecor -stipple bitmap -widthlargura_da_linha | Semelhante ao widget canvas: desenha um oval. |
| gdi photo [-destination "x y [w h]"] -photo nome | Exibe uma imagem colorida nas coordenadas especificadas. |
| gdi polygon hdc x1 y1... xn yn -fill cor -outline cor -smooth [true|false] -splinesteps número -stipple bitmap-widthlargura_da_linha | Semelhante ao widget canvas: desenha um polígono. |
| gdi rectangle hdc x1 y1 x2 y2 -fill cor -outline cor -stipple bitmap-widthlargura_da_linha | Semelhante ao widget canvas: desenha um retângulo. |
| gdi text hdc x y -anchor [center|n|e|s|w] -fill cor -fontfonte-justify [left|right|center] -stipple bitmap -textstring-width largura_da_linha | Semelhante ao widget canvas: exibe uma linha de texto. |
| gdi version | Retorna a versão da biblioteca. |
Exemplos
O exemplo a seguir mostra como gerar um relatório utilizando as bibliotecas gdi e printer:
# Abre o job de impressao
set hdc [printer open]
printer job start
gdi map $hdc -mode MM_LOMETRIC
set novapagina 1
# As posicoes, as vezes, sao negativas, na vertical. Se for o seu caso,
# utilize um valor negativo para pos e decremente-o, ao inves de incrementa-lo,
# no loop abaixo. A minha impressora EPSON Stylus COLOR 600, a jato de tinta,
# requer valores negativos, ja a minha impressora XEROX DocuPrint P8e, a laser,
# reguer valores positivos. Multiplique o valor em milimetros por 10.
set pos 200
set numero 1
for {set i 0} {$i < 100} {incr i} {
if {$novapagina == 1} {
printer page start
gdi text $hdc 200 $pos -anchor w -justify left -font {Arial 12 bold} -text "TESTE DE IMPRESSAO"
set pos [expr $pos + 50]
gdi line $hdc 200 $pos 2000 $pos
set pos [expr $pos + 50]
set novapagina 0
set numero 1
}
gdi text $hdc 200 $pos -anchor w -justify left -font {Arial 10} -text "Linha:"
gdi text $hdc 500 $pos -anchor w -justify left -font {Arial 10} -text $i
set pos [expr $pos + 50]
incr numero
if {$numero > 50} {
set novapagina 1
set pos 200
set numero 1
printer page end
}
}
gdi text $hdc 200 $pos -anchor w -justify left -font {Arial 10} -text "Copyright(C) 2000 by Roberto Luiz Souza Monteiro"
set pos [expr $pos + 50]
gdi text $hdc 200 $pos -anchor w -justify left -font {Arial 10} -text "Este codigo pode ser reutilizado nos termos da licenca GNU LGPL"
printer page end
printer job end
printer close
Imprimindo em ambiente UNIX
Nenhuma biblioteca é necessária para imprimir em ambiente UNIX, pois o widget canvas é capaz de gerar uma saída PostScript que pode ser enviada diretamente para o comando lpr. Assim, veremos apenas um exemplo de como imprimir usando o widget canvas, sem entrar em detalhes sobre o comando postscript, já que ele foi apresentado na aula 13.
Exemplos
O exemplo a seguir utiliza um canvas para imprimir uma pagina de cada vez. Neste exemplo nao ha recurso de visualizacao:
# cria uma area de impressao
toplevel .t
wm withdraw .t
canvas .t.c -width 210m -height 297m
pack .t.c
# Configura uma flag para sinalizar a mudanca de pagina
set novapagina 1
# Posicoes em mm.
set unid m
set pos 20
set numero 1
for {set i 0} {$i < 100} {incr i} {
if {$novapagina == 1} {
.t.c create text 20m $pos$unid -anchor w -justify left -font {Arial 12 bold} -text "TESTE DE IMPRESSAO"
set pos [expr $pos + 5]
.t.c create line 20m $pos$unid 2000 $pos$unid
set pos [expr $pos + 5]
set novapagina 0
set numero 1
}
.t.c create text 20m $pos$unid -anchor w -justify left -font {Arial 10} -text "Linha:"
.t.c create text 50m $pos$unid -anchor w -justify left -font {Arial 10} -text $i
set pos [expr $pos + 5]
incr numero
if {$numero > 50} {
set novapagina 1
set pos 20
set numero 1
.t.c postscript -x 0 -y 0 -width 210m -height 297m -file /tmp/pagina$i.ps
exec lpr /tmp/pagina$i.ps .t.c delete all
} } # Destroi a area de impressao
destroy .t
Um exemplo mais avancado de impressao
sera apresentado no final deste curso. Eu realizei alguns testes com o
canvasprintdialog
dos Iwidgets, do [incr Tcl/Tk], mais a caixa de dialogo apresentou muita
instabilidade. Eu recomendo um estudo do codigo fonte da minha biblioteca
de impressao, que faz parte dos meus mega-widgets. Procure na area de download
do meu site: http://www.souzamonteiro.com.
Para uma descrição detalhada de todos os comandos disponíveis para impressão em Tcl/Tk, consulte a documentação da sua biblioteca de impressão.
Para maiores informações envie e-mail para info@souzamonteiro.com.
| http://www.souzamonteiro.com |
Copyright(C) 2000 by Roberto Luiz Souza Monteiro