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!