Imprimir arquivos PDF através do Java

Olá Pessoal, tenho a necessidade de imprimir arquivos pdf através de uma aplicação em Java, o mesmo deve aceitar a configuração de alguns parâmetros como quantidade de cópias, cor (Colorido ou escala de cinza) e retrato/paisagem.

Estou realizando alguns testes com as classes ‘java.awt.print.PrinterJob’ e ‘javax.print.DocPrintJob’ para realizar a impressão. Ambas aceitam o ‘PrintRequestAttributeSet’ que me permitiria configurar os parâmetros desejados, porém nem todos funcionam.

Por exemplo: Configuro o attributeSet para um número x de cópias e o arquivo só imprime uma vez ou configuro o atributo como ‘Chromaticity.MONOCHROME’ e o mesmo continua imprimindo colorido.

Segue alguns exemplos de código:

//Só limita o range de impressão. Imprimi página 1 e 2, porém não imprime duas cópias e continua imprimindo colorido.
PDDocument pdfFile = PDDocument.load(new File("MYPATH"));
PrinterJob job = PrinterJob.getPrinterJob();
job.setPageable(new PDFPageable(pdfFile));
PrintRequestAttributeSet printSet = new HashPrintRequestAttributeSet();
printSet.add(new Copies(2));
printSet.add(new PageRanges(1,2));
printSet.add(Chromaticity.MONOCHROME);
job.print(printSet);

//Mesmo problema
PrintService defaultPrintService = PrintServiceLookup.lookupDefaultPrintService();
DocPrintJob printerJob = defaultPrintService.createPrintJob();
File pdfFile = new File("MYPATH");	 
SimpleDoc simpleDoc = new SimpleDoc(pdfFile.toURL(), DocFlavor.URL.AUTOSENSE, null);
PrintRequestAttributeSet printSet = new HashPrintRequestAttributeSet();
printSet.add(new Copies(2));
printSet.add(Chromaticity.MONOCHROME);
printSet.add(new PageRanges(1,1));
System.out.println("teste");
try {
      printerJob.print(simpleDoc, printSet);
} catch (PrintException ex) {
      ex.printStackTrace();
}

Sabem informar alguma biblioteca que possa me auxiliar nesse processo, ou tutoriais??

Obrigado!

tem o pdfBox biblioteca muito boa

1 curtida

Estou utilizando o pdfBox tbm, segui os exemplos do próprio svn do apache para realizar a impressão, porém o único atributo que funciona é o range de páginas, a quantidade de cópias e a cor da impressão são ignorados.

      PDDocument document = new PDDocument().load(new File("MYPATH"));
	  
	  PrinterJob job = PrinterJob.getPrinterJob();
      job.setPageable(new PDFPageable(document));

      // define custom paper
      Paper paper = new Paper();
      paper.setSize(306, 396); // 1/72 inch
      paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight()); // no margins

      // custom page format
      PageFormat pageFormat = new PageFormat();
      pageFormat.setPaper(paper);
      
      // override the page format
      Book book = new Book();
      // append all pages
      book.append(new PDFPrintable(document), pageFormat, document.getNumberOfPages());
      job.setPageable(book);
      PrintRequestAttributeSet att = new HashPrintRequestAttributeSet(new PageRanges(1,2));
      //Setando atributos copias.
      att.add(new Copies(2));
      //Setando copias diretamente no PrinterJob.
      job.setCopies(5);
      job.print(att);

Resolvi meu problema! ignorando esse array de atributos na hora da impressão. Acabei utilizando a própria biblioteca do pdfbox, processei o arquivo antes da impressão, convertendo o documento para escala de cinza, delimitando range da impressão, quantidade de copias…

para quem se interessar ou necessitar de uma solução semelhante segue link: Repositório

observações e sugestões são sempre bem vindas!

Obrigado a todos!