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:

Descompacte os arquivos no diretório C:\Arquivos de Programas\Tcl\lib\.

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 gdi
A 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
info@souzamonteiro.com

Copyright(C) 2000 by Roberto Luiz Souza Monteiro