Imprimir varias paginas

3 respostas
A

Tudo bem galera, sou novo no forum e ja gostaria de ajuda de voces para um probleminha nao muito simples. desenvolvi um programa para imprimir cartoes magneticos e esta imprimindo no cartao belizinha com um pequeno probleminha, quando mando imprimir mais de uma carteira a impressora imprimi a primeira certinho mas da segunda pra frente ela imprimi em cima da primeira carteirinha e so quando termina todas impressoes que a impressora ejeta a carteirinha. Estou usando o jobPrintable, aguem tem alguma dica que possa me ajudar? Quando vou imprimir mais de uma carteirinha o programa entra em um loop onde cada vez pega os novos valores ai queria tipo em cada vez que passasse pelo loop eu criasse como se fosse uma nova pagina, ou seja cada cartao seria uma pagina, ai depois mandaria a impressao com X paginas acho que assim funcionaria, so nao sei como fazer isso. Obrigado

3 Respostas

X

Cara, seguinte. Também estou com problemas para realizar impressão. Mas o meu é um pouco diferente.

Mas assim, pelo que sei, para você ter páginas você pode tomar como exemplo o meu código.
Eu imprimo um componente que suporta duas JTable.

Dá uma olhadinha:

package util;

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.swing.JOptionPane;

import com.jidesoft.pivot.AggregateTablePane;

/**
 * Classe que imprime uma JTable
 * 
 * @author Guilherme I. Keller TODO - Uma melhor explicacao & comentarios.
 */
public class PrintJTable implements Printable {

	private AggregateTablePane tabela;

	private PrinterJob printerJob;

	private Graphics graphics;

	private Graphics2D graphics2d;

	/**
	 * Metodo construtor da classe
	 * 
	 * @param tabela
	 *            Uma JTable a ser impressa
	 * @return
	 */
	public void ImprimirJTable(AggregateTablePane tabela) {

		this.tabela = tabela;

		printerJob = PrinterJob.getPrinterJob();
		printerJob.setPrintable(this);
		printerJob.setJobName("Imprimindo uma JTable");
		PageFormat p = new PageFormat();
		p.setOrientation(PageFormat.LANDSCAPE);
		printerJob.pageDialog(p);
		printerJob.defaultPage().setOrientation(PageFormat.LANDSCAPE);
		if (printerJob.printDialog()) {
			try {
				printerJob.print();
			} catch (PrinterException ex) {
				JOptionPane.showMessageDialog(null,
						"Ocorreu um erro durante a impressão. \n"
								+ ex.toString(), "Erro do Sistema",
						JOptionPane.ERROR_MESSAGE);
			}
		}
	}

	/**
	 * Metodo responsavel pela impressao da JTable
	 */
	public int print(Graphics g, PageFormat pageFormat, int pageIndex)
			throws PrinterException {

		graphics2d = (Graphics2D) g;
		graphics2d.setColor(Color.black);

		int fontHeight = graphics2d.getFontMetrics().getHeight();

		int fontDesent = graphics2d.getFontMetrics().getDescent();

		double pageHeight = pageFormat.getImageableHeight() - fontHeight;

		double pageWidth = pageFormat.getImageableWidth();

		double tableWidth = (double) tabela.getMainTable().getColumnModel()
				.getTotalColumnWidth()
				+ tabela.getRowHeaderTable().getColumnModel()
						.getTotalColumnWidth();

		double mainTableWidth = (double) tabela.getMainTable().getColumnModel()
				.getTotalColumnWidth();

		double headerTableWidth = (double) tabela.getRowHeaderTable()
				.getColumnModel().getTotalColumnWidth();
		double scale = 1;

		if (tableWidth >= pageWidth) {
			scale = pageWidth / tableWidth;
		}
		/** Header */
		double headerHeightOnPage = tabela.getRowHeaderTable().getTableHeader()
				.getHeight()
				* scale;

		double tableWidthOnPage = headerTableWidth * scale;

		double oneRowHeight = (tabela.getRowHeaderTable().getRowHeight() + tabela
				.getRowHeaderTable().getRowMargin())
				* scale;

		int numRowsOnAPage = (int) Math
				.floor(((pageHeight - headerHeightOnPage) / oneRowHeight));

		double pageHeightForTable = oneRowHeight * numRowsOnAPage + 2
				* tabela.getRowHeaderTable().getRowMargin();

		int totalNumPages = (int) Math.ceil(((double) tabela.getRowCount())
				/ numRowsOnAPage);

		if (pageIndex >= totalNumPages) {
			return NO_SUCH_PAGE; // No more pages
		}

		graphics2d.translate(pageFormat.getImageableX(), pageFormat
				.getImageableY());

		graphics2d.translate(0f, headerHeightOnPage);

		graphics2d.translate(0f, -pageIndex * pageHeightForTable);

		if (pageIndex + 1 == totalNumPages) {

			int lastRowPrinted = numRowsOnAPage * pageIndex;

			int numRowsLeft = tabela.getRowCount() - lastRowPrinted;

			graphics2d.setClip(0, (int) Math
					.ceil(((pageHeightForTable) * pageIndex)), (int) Math
					.ceil(tableWidthOnPage), (int) Math.ceil(oneRowHeight
					* numRowsLeft));
		}
		// else clip to the entire area available.
		else {
			graphics2d.setClip(0, (int) Math
					.ceil(((pageHeightForTable) * pageIndex)), (int) Math
					.ceil(tableWidthOnPage), (int) Math
					.floor(pageHeightForTable));
		}

		graphics2d.scale(scale, scale);

		tabela.getRowHeaderTable().paint(graphics2d);

		graphics2d.scale(1 / scale, 1 / scale);

		graphics2d.translate(0f, pageIndex * pageHeightForTable);

		graphics2d.translate(0f, -headerHeightOnPage);

		graphics2d.setClip(0, 0, (int) Math.ceil(tableWidthOnPage), (int) Math
				.ceil(headerHeightOnPage));

		graphics2d.scale(scale, scale);

		tabela.getRowHeaderTable().getTableHeader().paint(graphics2d); //

		graphics2d.scale(1 / scale, 1 / scale);

		/** Main */

		graphics2d = null;
		graphics2d = (Graphics2D) g;
		graphics2d.setColor(Color.black);

		tableWidthOnPage = mainTableWidth * scale;

		graphics2d.translate(pageFormat.getImageableX(), pageFormat
				.getImageableY());

		graphics2d.translate(0f, headerHeightOnPage);

		graphics2d.translate(tabela.getRowHeaderTable().getWidth() * scale,
				-pageIndex * pageHeightForTable);

		graphics2d.setClip(0, (int) (pageHeightForTable * pageIndex),
				(int) tableWidthOnPage, (int) pageHeightForTable);
		// }

		graphics2d.scale(scale, scale);

		tabela.getMainTable().paint(graphics2d);

		graphics2d.scale(1 / scale, 1 / scale);

		graphics2d.translate(0f, pageIndex * pageHeightForTable);

		graphics2d.translate(0f, -headerHeightOnPage);

		graphics2d.setClip(0, 0, (int) Math.ceil(tableWidthOnPage), (int) Math
				.ceil(headerHeightOnPage));

		graphics2d.scale(scale, scale);

		tabela.getMainTable().getTableHeader().paint(graphics2d);

		return Printable.PAGE_EXISTS; // continues printing
	}
}
A

Olha eu conseguir imprimir… ficou um pouco lento mais para imprimir mas deu certo, nao sei se é o jeito certo mais ta imprimindo, ta lento tipo imprimi uma pagina ai p comecar a imprimir a proxima demora 5 segundos, gostaria que saisse logo em seguida mas tudo bem, e o seu problema qual é? Dependendo posso ajudar.

X

Bem, essa mesma classe ai, quando imprime aqui para mim imprime errado.
No caso se eu imprimo no OneNote, vai q é uma beleza. Agora na impressora, os objetos ficam desalinhados.
Tem como postar ai a sua classe? As vezes olhando a sua que está funcionando, eu descubra o problema da minha.

Valeu!

Criado 30 de março de 2009
Ultima resposta 2 de abr. de 2009
Respostas 3
Participantes 2