Impressão de relatórios em modo texto

Olá,

Tenho uma aplicação web onde certos relatórios precisam ser impressos em modo texto, devidamente formatados “no velho estilo Dbase/Clipper/etc”, pois o usuário possui impressoras matriciais e precisa imprimir muitas páginas de forma ágil e rápida. Tem alguma coisa pronta para usar em Servlets, ou eu teria que fazer algum programa em outra linguagem que recebesse da Servlet o conteúdo a imprimir (pacote TCP/IP via Socket ou um arquivo temporário gerado no HD do servidor) e depois fizesse a chamada direta a LPT1??? Ou ainda fazer no braço um esquema do tipo “type to lpt1” (o que não seria portável se o servidor fosse Linux!).

Não entendi. Como ‘formatado em modo texto’? ‘Modo texto’ não seria sem formatação?!?

Você quer passar seus dados para um programa cliente que o imprima?

Se sim, você pode gerar XML com os dados estruturados, enviar via HTTP, formatá-lo no cliente e mandar imprimir.

Evite trabalhar diretamente com sockets quando não for o caso.

A questão é a seguinte:

Imagine que você tenha um sistema todo via Web, e que seu cliente precise emitir Notas Fiscais das Contas Recebidas em um formulário contínuo, devido ao fato de que a Secretaria de Fazenda não aceita NF em papel avulso.

Neste caso, eu obrigatoriamente tenho que usar impressora matricial. E imprimir pelo modo gráfico em impressora matricial não funciona bem por três motivos:

  1. é uma carroça;
  2. a qualidade fica péssima;
  3. e PRINCIPAL: para posicionar os campos corretamente em uma NF, é melhor usar o modo condensado e impressão em modo texto, devido à maior precisão de linha/coluna.

Então, como eu faço para a minha aplicação web (uma servlet) imprimir em modo texto:

  1. alguma API de impressão em modo texto do Java => NÃO SEI SE ISSO EXISTE, mas seria a solução ideal
  2. a servlet chamar um outro programa (via Socket, via RMI, via arquivo temporário ou qualquer outra coisa) que consiga pegar os dados a serem impressos que já estão formatados em linha/coluna e imprimir.

Se a opção 2) for usada, eu sei fazer isso em Delphi, por exemplo, pois aponto o arquivo de saída para a LPT1 e funciona numa boa. Por isso pensei em usar Socket entre a servlet Java e a aplicação Delphi. Agora, caso exista uma solução multiplataforma em Java, melhor ainda, pois não terei que manter código em duas linguagens.

Resumindo: o problema é… o Java tem API ou componente para impressão em modo texto ou eu preciso fazer alguma mutreta dependente do SO?

Aidna que você opte pelo Delphi na ponta, tente usar XML sobre HTTP ou algo neste nível. Sockets vão te dar dor de cabeça.

Acho qeu em UNIX você poderia escrever na impressora normalmente, no Windows não sei. De repetne você pdoe usar um cliente Swing com este parâmetro (porta da impressora) configurável. Quando se conversa com o SO diretamente não tem como manter muita portabilidade…

[]s

Ou seja, nao existe API ou componente para impressao em modo texto no Java, certo?

Olá

Se está tudo em uma rede local um modo simples é você fazer a tal solução em Delphi que já de seu total domínio e direto do servidor enviar por socket o conteúdo da impressão para a máquina onde fica o servidorzinho Delphi ligado na impressora.

Um outro modo bem simples é o seu servidor pura e simplesmente gravar um arquivinho texto com o conteúdo da impressão e o Delphi que imprime fica monitorando o tal diretório. Só adote esta solução caso tenha dificuldades em usar sockets no Delphi.

Não use xml para enviar os dados pois vai complicar os 2 lados (apesar de facilitar muito a depuração). Use mesmo o velho e bom csv. Caso tenha vírgulas no conteúdo, use | (pipe) como separador.

Mas se sua aplicação NÃO está em rede local e a impressora está na mesma rede da máquina do cliente, embuta na página HTML uma pequena applet assinada e esta applet é que deve se conectar com a aplicação Delphi.

[color=“red”]Importante:[/color]
Você precisa obter resposta do Delphi se a impressão teve sucesso ou não para poder reimprimir ou cancelar a nota!

[]s
Luca

Somente para confirmar: nao existe API ou componente para impressao modo texto em Java?

Olá

É claro que existe. Se quiser fazer assim, veja java.io.

[]s
Luca

Depende muito. Às vezes pode ser overhead demais, mas tentar estruturar formatos planos pode ser muito mais complicado. Não dá pra saber com tão poucos detalhes.

Ah, e dá muito bem pra se virar som o CSV usando escape ao invés de usar PSV [pipe-separated-values :smiley: ], que não é padrão :wink:

[]s

Olá

Phillip, o problema do XML é que pode ser mais um domínio de conhecimento em 2 linguagens. Se as equipes dominam XML e conseguem desenvolver a escrita e leitura das mensagens no mesmo prazo, então o único problema do XML é aumentar o tamanho das mensagens. Isto pode ser compensado pelas facilidades na depuração que é bem mais facil do que csv.

Já no caso de aplicações fora de uma rede local e adotando a solução com applets, a inclusão do parser aumenta o tamanho da applet.

[]s
Luca

Para quem tiver interesse, achei um componente bem interessante, que custa 29 euros (www.java4less.com => RTextPrinter)…