GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Como imprimir um página?


#1

Como eu faço para imprimir uma página pelo java?

Eu tava querendo imprimir uma página que contivesse o que eu passasse tipo "String "+ nome + "\n Recibo:"...
coisas do tipo que eu posso adicionar variaveis..

alguem sabe como?


#2

Use um PrinterJob!
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/print/PrinterJob.html

Exemplo:
http://www.java2s.com/Code/Java/2D-Graphics-GUI/PrintinJava2PrinterJob.htm


#3

Mas entao... eu tow usando essa classe pra imprimir:

package br.com.caep.imp;
import java.net.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.print.PrintService;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.JobName;
import javax.print.attribute.standard.OrientationRequested;
public class Impressao implements Printable {
    /**
     * Efetua impressão do texto passado como parâmetro.
     * @param texto
     */
    public Impressao(String texto) {
        text += texto;
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        aset.add(OrientationRequested.PORTRAIT);
        aset.add(new Copies(1));
        aset.add(new JobName("Relatório", null));
        /*
         * Cria um "Printer job"
         */
        PrinterJob pj = PrinterJob.getPrinterJob();
        pj.setPrintable(this);
        /* 
         * Localiza um serviço de impressão
         * que possa tratar esta requisção.
         */
        PrintService[] services = PrinterJob.lookupPrintServices();
        if (services.length > 0) {
            System.out.println("Impressora selecionada: " + services[0].getName());
            try {
                pj.setPrintService(services[0]);
                pj.pageDialog(aset);
                if (pj.printDialog(aset)) {
                    pj.print(aset);
                }
            } catch (PrinterException pe) {
                System.err.println(pe);
            }
        }
    }
    /**
     * Método necessário quando a interface Printable é implementada.
     */
    public int print(Graphics g, PageFormat pf, int pageIndex) {
        if (pageIndex == 0) {
            Graphics2D g2d = (Graphics2D) g;
            g2d.translate(pf.getImageableX(), pf.getImageableY());
            g2d.setColor(Color.black);
            /*
             * Imprime o texto passado, na coluna 10 e na linha 5 
             * da página a ser impressa 
             */
            g2d.drawString(text, 10, 5);
            return Printable.PAGE_EXISTS;
        } else {
            return Printable.NO_SUCH_PAGE;
        }
    }
    private String text = "";
}

mas quando imprimi ele come a metade de cima das letras... e não consigo imprimir mais de uma linha quando eu passo um String grande...

Sabe o que pode ser?


#4

ninguem sabe oq pode ser? essa impressão tá cortando a metade de cima das letras e não imprime mais de uma linha!


#5

Po galera... não consegui até agora consertar isso.. nínguem tem outro exemplo de classe de impressão onde eu passe um texto e imprima ele?

Se não for pedir muito queria saber também como é o melhor jeito de passar esse texto.. como somente uma String?


#6

Artur...

Eu tambem estava com um problema parecido com esse, para resolver apenas aumentei o tamanho da ImageableArea no objeto Pager.

Espero ter ajudado.
Juju


#7

Jucely,

Será que você pode postar o seu código? Porque no meu eu não uso esse ImageableArea...

Pra eu também ver um código massa pra poder aprender como faz.. vlw!


#8

Este é o código que eu estou usando, tentei fazer um objeto Paper e aumentar o ImageableArea, mas continua como antes, cortando uma parte das letras...

    public Impressao(String texto) {
        text += texto;
        Paper paper = new Paper();
        paper.setImageableArea(0,0,500,500);
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        aset.add(OrientationRequested.PORTRAIT);
        aset.add(new Copies(1));
        aset.add(new JobName("Relatório", null));
        /*
         * Cria um "Printer job"
         */
        PrinterJob pj = PrinterJob.getPrinterJob();
        pj.setPrintable(this);        
        /* 
         * Localiza um serviço de impressão
         * que possa tratar esta requisção.
         */
        PrintService[] services = PrinterJob.lookupPrintServices();
        if (services.length > 0) {
            System.out.println("Impressora selecionada: " + services[0].getName());
            try {
                pj.setPrintService(services[0]);
                pj.pageDialog(aset);
                if (pj.printDialog(aset)) {
                    pj.print(aset);
                }
            } catch (PrinterException pe) {
                System.err.println(pe);
            }
        }
    }

Alguém tem alguma idéia?


#9

arthurthiago, eu não mexo com a print API há uns 2 anos, mas na época eu usei essecódigo aqui para aprender do livro "Programando com o Visual Editor" de Ivan Mecenas (sim o código é porco com sql no meio e o diabo, mas dá para quebrar o galho):

import java.awt.*;
import java.sql.*;
import javax.swing.*;
import java.awt.print.*;
/**
 * Autor: 
 * Data : 
 */
public class RelatorioPageable extends JDialog implements Printable {
	private JPanel jContentPane = null;
	private JPanel jPanel = null;
	private JButton btnImprimir = null;
	private JButton btnSair = null;
	private String DRV;
	private String url;
	private String userName;
	private String password;
	private Connection conn;
	private String[][] aRegs;
	private int nuRegs = 0;
	private int nuPags = 0;
	private int indice = 0;
	private int fimPag = 0;
	private int tamPag = 30;
	private double total = 0.0;
	private Utilidades utils;
	public RelatorioPageable() {
		super();
		initialize();
	}
	private void initialize() {
		this.setSize(300,200);
		this.setContentPane(getJContentPane());
		this.setTitle("Relatório de Contas a Pagar");
		// Lê arquivo de configuração
		ConfiguracaoFirebird cf = new ConfiguracaoFirebird();
		DRV = cf.getDRV();
		url = cf.getUrl();
		userName = cf.getUserName();
		password = cf.getPassword();
		// Carrega o driver Firebird
		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(url, userName, password);
		}
		catch (ClassNotFoundException cnfex) {
			System.err.println("Não foi possível carregar o driver." );
			cnfex.printStackTrace();
			System.exit(1); // Encerra o programa
		}
		catch (SQLException sqlex) {
			System.err.println("Não foi possível estabelecer conexão." );
			sqlex.printStackTrace();
		}
		// Dimensiona a tela
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		setSize(new Dimension(300, 200));
		setLocation((screenSize.width-300)/2, (screenSize.height-200)/2);
		setVisible(false);
		// Instancia a classe Utilidades
		utils = new Utilidades();
	}
	private JPanel getJContentPane() {
		if(jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getJPanel(), BorderLayout.SOUTH);
		}
		return jContentPane;
	}
	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.add(getBtnImprimir(), null);
			jPanel.add(getBtnSair(), null);
		}
		return jPanel;
	}
	private JButton getBtnImprimir() {
		if (btnImprimir == null) {
			btnImprimir = new JButton();
			btnImprimir.setFont(new Font("Dialog", Font.BOLD, 11));
			btnImprimir.setText("Imprimir");
			btnImprimir.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) {    
					recuperaDados();
					montaPagina();
				}
			});
		}
		return btnImprimir;
	}
	private JButton getBtnSair() {
		if (btnSair == null) {
			btnSair = new JButton();
			btnSair.setFont(new Font("Dialog", Font.BOLD, 11));
			btnSair.setText("Sair");
			btnSair.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) {    
					setVisible(false);
					dispose();
				}
			});
		}
		return btnSair;
	}
	private void recuperaDados() {
		int resto = 0;
		String qryA = " select count(*) "
	     		      + " from CONTA c, RUBRICA r "
			          + " where c.TIPO = 'A Pagar' "
			          + " and c.DT_PAGAMENTO is null "
			          + " and c.NU_RUBRICA = r.NU_RUBRICA ";
		String qryB = " select c.NU_CONTA, c.DT_CONTA, "
                + "   c.VR_CONTA, c.DT_VENCIMENTO, r.DESCRICAO "
                + " from CONTA c, RUBRICA r "
                + " where c.TIPO = 'A Pagar' "
                + " and c.DT_PAGAMENTO is null "
                + " and c.NU_RUBRICA = r.NU_RUBRICA "
                + " order by c.NU_CONTA, c.DT_CONTA ";
		String qryC = " select sum(c.VR_CONTA) as total "
                + " from CONTA c, RUBRICA r "
                + " where c.TIPO = 'A Pagar' "
                + " and c.DT_PAGAMENTO is null "
                + " and c.NU_RUBRICA = r.NU_RUBRICA ";
		// Estabelece conexão com o banco de dados
		ConexaoFirebird firebird = new ConexaoFirebird();
		firebird.setDRV(DRV);
		firebird.setURL(url);
		firebird.setUserName(userName);
		firebird.setPassword(password);
		if (firebird.conecta()) {
			nuRegs = firebird.regCount(qryA);
			if (nuRegs &gt 0) {
				aRegs = new String[nuRegs][5];
				firebird.getColumn(qryB, aRegs, 5);
				if (nuRegs &lt= tamPag) {
					nuPags = 1;
				} else {
					resto = nuRegs % tamPag;
					nuPags = nuRegs / tamPag;
					if (resto &gt 0) nuPags = nuPags + 1;
				}
				total = Double.parseDouble(firebird.getColumn(qryC));
			}
			firebird.desconecta();
		}	
 	}
	private void montaPagina() {
		PrinterJob job = PrinterJob.getPrinterJob();
		PageFormat pageFormat = job.defaultPage();
		pageFormat.setOrientation(PageFormat.PORTRAIT);
		Book bk = new Book();
		bk.append(this, pageFormat, nuPags);
		job.setPageable(bk);
		//if(job.printDialog()) {
			try {
				job.print();
			} catch (Exception PrinterException) {
					JOptionPane.showMessageDialog(null, PrinterException, 
						"Erro em job.print()", JOptionPane.ERROR_MESSAGE);
			}
		//}
	}
	public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) 
		throws PrinterException {
		int col = 15;
		int lin = 80;
		if (pageIndex &gt= nuPags) {
			return Printable.NO_SUCH_PAGE;
		}
		trataPagina(pageIndex);
		Graphics2D g2 = (Graphics2D)graphics;
		g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
		g2.setColor(Color.black);
		Font font = new Font("Monospaced", Font.PLAIN, 10);
		g2.setFont(font);
		// Cabeçalho
		String str = "RELATÓRIO DE CONTAS A PAGAR - Página " + "" + (pageIndex + 1);
		g2.drawString(str, col, 10);
		str = "Número  Data        Valor        Vencimento  Rubrica";
		g2.drawString(str, col, 50);
		str = "------  ----------  -----------  ----------  -------";
		g2.drawString(str, col, 65);
		// Detalhe
		for (int i = indice; i &lt fimPag; i++) {
			g2.drawString(aRegs[i][0], col, lin);
			g2.drawString(utils.formataDataSTR(aRegs[i][1]), col+50, lin);
			g2.drawString(utils.formataMoeda(aRegs[i][2]), col+120, lin);
			g2.drawString(utils.formataDataSTR(aRegs[i][3]), col+200, lin);
			g2.drawString(aRegs[i][4], col+270, lin);
			lin = lin + 15;
		}
		// Fechamento
		if (fimPag == nuRegs) {
			lin = lin + 15;
			g2.drawString("Total a ser pago :  " +
				utils.formataMoeda("" + total), col, lin);
		}
		return Printable.PAGE_EXISTS;
	}
	private void trataPagina(int numPagina) {
		if (numPagina == 0) {
			indice = 0;
			fimPag = tamPag;
			if (fimPag &lt nuRegs) fimPag = nuRegs;
		} else {
				indice = numPagina * tamPag;
		    fimPag = indice + tamPag;
		    if (fimPag &lt nuRegs) fimPag = nuRegs;
		}
		if (fimPag &gt nuRegs) fimPag = nuRegs;
	}
}

Na época, quando eu tive problemas com as colunas, eu mexi no drawString
Espero q lhe ajude! :wink:


#10

Testei o codigo q vc postou e realmente ta cortando as letras.
Corrigi mudando o tamanho do "paper":

paper.setImageableArea(-10,-10,500,500);


#11

Valeu pela ajuda ai galera!

Mas estou com outro problema ainda: Como que eu posso fazer para imprimir uma String grande? Porque quando eu passo uma String maior que o papel, essa String não passa para a linha de baixo automaticamente...

alguém tem alguma idéia?


#12

Galera... é o seguinte, vou especificar totalmente o meu problema:

Tenho o seguinte programa onde eu gerencio dados por uma tabela. Todos os dados são pegos de um banco e atualizados em tempo real quando o programa está sendo executado:

Pois então, não sei como eu posso imprimir essa tabela numa página. Gostaria de imprimir só os três campos centrais da tabela de cada dado.

Meu código de impressão está funcionando maneiro quando se passa uma String. A não ser que ele não pula para a linha de baixa quando o String é muito grande:

package imp;
import java.awt.print.Paper;
import java.net.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.print.PrintService;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.JobName;
import javax.print.attribute.standard.OrientationRequested;
public class Impressao implements Printable {
    /**
     * Efetua impressão do texto passado como parâmetro.
     * @param texto
     */
    public Impressao(String texto) {
         text += texto;
         Paper paper = new Paper();
         paper.setImageableArea(-10,-10,500,500);
         PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
         aset.add(OrientationRequested.PORTRAIT);
         aset.add(new Copies(1));
         aset.add(new JobName("Relatório", null));
         /*
          * Cria um "Printer job"
          */
         PrinterJob pj = PrinterJob.getPrinterJob();
         pj.setPrintable(this);        
         /* 
          * Localiza um serviço de impressão
          * que possa tratar esta requisção.
          */
         PrintService[] services = PrinterJob.lookupPrintServices();
         if (services.length > 0) {
             System.out.println("Impressora selecionada: " + services[0].getName());
             try {
                 pj.setPrintService(services[0]);
                 pj.pageDialog(aset);
                 if (pj.printDialog(aset)) {
                     pj.print(aset);
                 }
             } catch (PrinterException pe) {
                 System.err.println(pe);
             }
         }
     }
    /**
     * Método necessário quando a interface Printable é implementada.
     */
    public int print(Graphics g, PageFormat pf, int pageIndex) {
        if (pageIndex == 0) {
            Graphics2D g2d = (Graphics2D) g;
            g2d.translate(pf.getImageableX(), pf.getImageableY());
            g2d.setColor(Color.black);
            /*
             * Imprime o texto passado, na coluna 10 e na linha 5 
             * da página a ser impressa 
             */
            g2d.drawString(text, 10, 10);
            return Printable.PAGE_EXISTS;
        } else {
            return Printable.NO_SUCH_PAGE;
        }
    }
    private String text = "";
}

Mas o que eu realmente queria era imprimir uma tabela com bordas e talz com os dados que estão na tela no momento.

Se alguém tiver alguma sugestão eu agradeço!

Espero a resposta! vlw!


#13

As suas duvidas são as mesmas q estou tendo.
Só acho estranho o esquema de pular de linha. Quando imprimo na tela sai do jeito q eu quero, mas na hora de imprimir sai tudo na mesma linha.
Também estou procurando a mesma resposta, se possível com a opção de visualizar impressão.


#14

Bom galera,

Consegui resolver o problema de imprimir a tabela. existe um método print na própria classe JTable:

MessageFormat headerFormat = new MessageFormat("O teu título"); 
    MessageFormat footerFormat = new MessageFormat("o teu footer"); 
    jTable1.print(JTable.PrintMode.FIT_WIDTH, headerFormat, footerFormat);

(by aterrapinto)

Mas só que a fonte tá saindo muito pequena e não to conseguindo aumentá-la...

se alguém souber tamos ai pra aprender! vlw


#15

Olá,
Estou usando o JTextArea ao invés do JTable, mas algumas configurações são parecidas. Para alterar a fonte é a mesma coisa do JTextArea:

JTextArea texto = new JTextArea();
texto.setFont(new Font("DialogInput", Font.PLAIN, 9));

Realmente para imprimir textos com quebras de linha e tabulação eu só to conseguindo jogando a string no JTextArea e para imprimir usando o comando: "JTextArea.print();", só q estou usando a opção com atributos para configurar a impressora e a página.


#16

E ai blz... tem um componente que vc monta seu formulario para impressão em um jpanel, ai vc pode visualizar impressão e tb imprimir!!!
De uma olhada!!!

http://www.guj.com.br/posts/list/54325.java


#17

Pq não trabalha com o iReport?


#18