Dúvida com impressao

1 resposta
denisspitfire

Quando eu rodo esse código, em uma impressora MP-4000 TH ela roda perfeitamente a impressao se for um txt. Se for um pdf mesmo que só tenha uma palavra, aparece todo codificado.

Em outra impressora, ela imprime varias paginas em branco.

Segue o código:

package impressao;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;

public class PrintPDFFactory {

    private static PrintService impressora;  

    public void printPDF(File f){

        try{
            DocFlavor dflavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
            PrintService[] impressoras = PrintServiceLookup.lookupPrintServices(dflavor, null);
            for(PrintService ps : impressoras){
                System.out.println("Impressora Encontrada: "+ps.getName());
                if(ps.getName().contains("Brother HL-3040CN series")){
                    System.out.println("Impressora Selecionada: "+ps.getName());
                    impressora = ps;
                    break;
                }
            }
            DocPrintJob dpj = impressora.createPrintJob();  
            FileInputStream fis = new FileInputStream(f);
            byte[] buffer = new byte[fis.available()];
            int buff = 0;
            while((buff = fis.available()) != 0){
                fis.read(buffer, 0, buff);
            }
            System.out.println(new String(buffer));
            InputStream stream = new ByteArrayInputStream(buffer);  
            DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;  
            Doc doc = new SimpleDoc(stream, flavor, null);  
            dpj.print(doc, null);
            
        }catch (Exception e) {
            e.printStackTrace();
        }

    }
    
    public static void main(String[] args) {
        PrintPDFFactory pdffactory = new PrintPDFFactory();
        pdffactory.printPDF(new File("C:/Users/willian/Desktop/teste.docx"));
    }
}

Alguem sabe pq?

1 Resposta

denisspitfire

Consegui este código

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;
import com.sun.pdfview.PDFRenderer;

public class agoraVai {
	public static void main(String[] args) throws IOException, PrinterException {

		// Criando arquivo PDF
		File f = new File("teste.pdf");
		FileInputStream fis = new FileInputStream(f);
		FileChannel fc = fis.getChannel();
		ByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
		PDFFile pdfFile = new PDFFile(bb); // Create PDF Print Page
		PDFPrintPage pages = new PDFPrintPage(pdfFile);

		// Criando job da impressão
		PrinterJob pjob = PrinterJob.getPrinterJob();
		PageFormat pf = PrinterJob.getPrinterJob().defaultPage();
		pjob.setJobName(f.getName());
		Book book = new Book();
		book.append(pages, pf, pdfFile.getNumPages());
		pjob.setPageable(book);

		// Enviando para impressora padrão
		pjob.print();
	}
}

class PDFPrintPage implements Printable {
	private PDFFile file;

	PDFPrintPage(PDFFile file) {
		this.file = file;
	}

	public int print(Graphics g, PageFormat format, int index)
			throws PrinterException {
		int pagenum = index + 1;

		if ((pagenum >= 1) && (pagenum <= file.getNumPages())) {

			Graphics2D g2 = (Graphics2D) g;
			PDFPage page = file.getPage(pagenum);
			double pwidth = format.getImageableWidth();
			double pheight = format.getImageableHeight();

			double aspect = page.getAspectRatio();
			double paperaspect = pwidth / pheight;

			Rectangle imgbounds;

			if (aspect > paperaspect) {
				// paper is too tall / pdfpage is too wide
				int height = (int) (pwidth / aspect);
				imgbounds = new Rectangle(
						(int) format.getImageableX(),
						(int) (format.getImageableY() + ((pheight - height) / 2)),
						(int) pwidth, height);
			} else {
				// paper is too wide / pdfpage is too tall
				int width = (int) (pheight * aspect);
				imgbounds = new Rectangle(
						(int) (format.getImageableX() + ((pwidth - width) / 2)),
						(int) format.getImageableY(), width, (int) pheight);
			}

			// renderizando a página
			PDFRenderer pgs = new PDFRenderer(page, g2, imgbounds, null, null);
			try {
				page.waitForFinish();
				pgs.run();
			} catch (InterruptedException ie) {
			}

			return PAGE_EXISTS;
		} else {
			return NO_SUCH_PAGE;
		}
	}
}

mas quando eu compacto ele para um jar ele nao funciona… acho estranho pq as bibliotecas vao junto. O.o
alguem consegue faze-lo funcionar apartir de um jar?

Criado 21 de maio de 2012
Ultima resposta 21 de mai. de 2012
Respostas 1
Participantes 1