Impressão no braço!

Bem gente, estou criando um metodo para realizar impressão, como não se trata de impressão de relatórios mas de apenas dados avulsos, decidi não usar JasperReport aqui, até para ganhar alguma habilidade com as APIs de impressão nativas do java e não ficar muito atrelado a frameworks. Quando começar a criar a parte de relatórios propriamente dito, ai sim faço uso de frameworks.

Bem, esse é meu método para impressão.

package ultil;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.AttributedString;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Matheus
 */
public class PrintDefault implements Printable{
// array de paragrafos do texto
    ArrayList texto;
    BufferedReader conteudo;

    public PrintDefault(String arquivo, String dados) throws IOException{
        //cria o arquivo temporário.
        Files.Write(arquivo, dados, false);
        // Obtem um job de impressao
      PrinterJob job = PrinterJob.getPrinterJob();
        // carrega o texto a ser impresso
        try {
            conteudo = new BufferedReader(new FileReader(arquivo));
        } catch (FileNotFoundException ex) {
            Logger.getLogger(PrintDefault.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "o arquivo temporário não foi gerado" + ex);
        }

        texto = new ArrayList();
        String linha = conteudo.readLine();
        while(linha != null){
            texto.add(linha);
            linha = conteudo.readLine();
        }

        conteudo.close();
        // Define o objeto a ser impresso
        job.setPrintable(this);
        // exibe o dialogo de impressao.
        if(job.printDialog()){
            try {
                // imprime o objeto printable
                job.print();
            } catch (PrinterException ex) {
                Logger.getLogger(PrintDefault.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "existem problemas na comunicação com a " +
                        "impressora" + ex);
            }
        }
    }

    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex){

        if(pageIndex != 0)
            return NO_SUCH_PAGE;

        Graphics2D gr = (Graphics2D) graphics;
        // determina o ponto de inicio do texto (inicio da area util + 10 pontos)
        float posX = (float) (pageFormat.getImageableX() + 10);
        float posY = (float) (pageFormat.getImageableY() + 10);
        // determina a largura do texto como 350 pontos (dpi)
        float largtext = 350;
        // para cada paragrafo, imprime o paragrafo formatado
        Iterator it = texto.iterator();

        while(it.hasNext()){

            String lin = (String) it.next();
       // caso haja uma linha em branco, substituir por um espaço
       // para permitir formatação
            if(lin.length() == 0)
                lin = " ";

            // texto formatado a ser impresso
            AttributedString string = new AttributedString(lin);
            // define a fonte e o tamanho do texto
            string.addAttribute(TextAttribute.FONT, new Font("FreeMono", Font.ITALIC, 11));
            // instancia um line breaker para o texto formatado
            LineBreakMeasurer breakline = new LineBreakMeasurer(string.getIterator(),
                    gr.getFontRenderContext());
            // cria um TextLayout para armazenar cada linha 'quebrada'
            TextLayout tl = breakline.nextLayout(largtext);

            while(tl != null){
                // posiciona o texto
                posY += tl.getAscent();
                tl.draw(gr, posX, posY);
                // soma espaço para a próxima linha
                posY += tl.getDescent() + tl.getLeading();
                tl = breakline.nextLayout(largtext);
            }
        } // fim dos paragrafos
        return PAGE_EXISTS;
    }
}

Ele cria um arquivo temporário com os dados a ser impressos, ta funfando perfeitamente, mas to querendo adicionar mais algumas funcionalidades como por exemplo imprimir junto com o texto uma logomarca tb, formatar individualmente apenas uma linha no texto, digamos que a primeira linha do texto seja um título “IMPRESSÃO DE DADOS”, como faço para pegar apenas essa primeira linha e formata-la como negrito, sublinhado?

Agradeço a ajuda!

alguém? :frowning:

Excelente tuto.

Aproveitando o mesmo, estou com um problema tb. Gostaria de imprimir um ArrayList. Como e possivel? Nao quero ficar salvando txt, depois imprimindo e depois excluindo. Quero imprimir direto o array. Segue abaixo meu codigo:

private void imprimeRecibo(){
// InputStream apontando para o conteúdo a ser impresso
FileInputStream fi = null;

    try {
        PrintService[] printerServices = PrintServiceLookup.lookupPrintServices(DocFlavor.INPUT_STREAM.AUTOSENSE, null);
        System.out.println("Impressoras com suporte: " + printerServices.length);
        PrintService printer = PrintServiceLookup.lookupDefaultPrintService();
        System.out.println("Impressora: " + printer.getName());
        System.out.println("Imprimindo arquivo txt");
        DocFlavor docFlavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
        HashDocAttributeSet attributes = new HashDocAttributeSet();
        String teste="texto";
        ArrayList<String> al = new ArrayList<String>();
        al.add(teste);
        al.add("ola mundo");

        fi = new FileInputStream("C:\\teste.txt");
        // Cria um Doc para impressão a partir do arquivo exemplo.txt
        Doc textDocument = new SimpleDoc(fi, docFlavor, attributes);
        // Configura o conjunto de parametros para a impressora
        PrintRequestAttributeSet printerAttributes = new HashPrintRequestAttributeSet();

        // exibe um dialogo de configuracoes de impressao
        DocPrintJob printJob = printer.createPrintJob();

        // Adiciona uma propriedade de impressão: imprimir 2 cópias
        //printerAttributes.add(new Copies(2));
        // Imprime o documento sem exibir uma tela de dialogo
        printJob.print(textDocument, printerAttributes);
        printJob.wait();

    } catch (InterruptedException ex) {
        Logger.getLogger(TesteImpressaoView.class.getName()).log(Level.SEVERE, null, ex);
    } catch (PrintException ex) {
        Logger.getLogger(TesteImpressaoView.class.getName()).log(Level.SEVERE, null, ex);
    } catch (FileNotFoundException ex) {
        Logger.getLogger(TesteImpressaoView.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        try {
            fi.close();
        } catch (IOException ex) {
            Logger.getLogger(TesteImpressaoView.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Nao sei se nesta linha: fi = new FileInputStream(“C:\teste.txt”); ou nesta: Doc textDocument = new SimpleDoc(fi, docFlavor, attributes);

eu deveria colocar direto o array. O exemplo acima, lendo arquivo, funciona perfeitamente, mas quero imprimir o array “al”

Obrigado a todos e abraco!