sexta-feira, 6 de novembro de 2009

Impressão Direta de PDF com Java

Neste exemplo, imprimimos um arquivo PDF direto do sistema. Para isso, basta informar uma parte ou todo o nome da impressora e indicar a localização do arquivo. Minha impressora é a printer001 e o meu arquivo como podem ver é o c:/teste.pdf. Deixem seus comentários.

package printpdf;

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("printer001")){
                    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:/teste.pdf"));
    }
}

11 comentários:

andre2205p disse...

OI, Testei este codigo mas a impressao sai criptografada.

Anônimo disse...

Valeu, Douglas! Seu código funcionou perfeitamente, obrigado.

Larissa disse...

Não consegui fazer funcionar, o documento vai para a impressora e gera um erro, não imprime de jeito nenhum. O que pode ser? O erro não é informado

Anônimo disse...

TA MOH BAO ESSE NEGOCIO AI

BruninJava disse...

Cara, comigo deu um NullPointerException na linha 50, onde eu passo como parâmetro do método printPDF o caminho do arquivo.
Este método exige um parâmetro do tipo File, eu tentei mudar para String e passar uma String com o caminho, mas não deu certo tb.
Pode me ajudar?

Dennys disse...

Parabens pela iniciativa. Só um detalhe para quem nao conseguiu imprimir: A impressora tem que reconhecer a PDF nativamente. Por isso que alguns estão obtendo resultados inesperados na impressão.
Verifiquem se a sua impressora tem a capacidade de reconhecer o PDF nativamente.

Adriano disse...

Estou com problema para imprimir, o arquivo vai para a fila de impressão e tranca a impressora, não imprime, tenho que cancelar a impressão, alguém teve o mesmo problema?

Obrigado

Gled.Carneiro disse...

Dougas, saiba que até hoje seu post esta ajudando alguém, parabéns minha joia...

Unknown disse...

Valeu, salvou meu dia..

RL disse...

Olá Douglas muito bom o seu código parabéns pela iniciativa.

Queria te perguntar se desejo imprimir todos os PDF´s de uma pasta que eu configurei no meu projeto, eu precisaria fazer a localização da impressora apenas uma vez como poderia modificar a classe para este fim.

RL disse...

Como seria para verificar se uma impressora reconhece um PDF Nativamente? estou com o mesmo problema do Adriano ou seja o arquivo vai para a fila de impressão e tranca a impressora, não imprime, tenho que cancelar a impressão alguém teria uma dica?