Imprimir PDF con JPedal
Investigando un poco acerca de la manipulacion de un documento PDF me encontré con una libreria llamada JPedal para manipular documentos PDf desde Java.
Al igual que otras librerías que ya he visto como iText y iReport entre otras, las cuales son de muy completas y te permiten hacer muchas tareas, entre ellas imprimir. La desventanja que tienes estas últimas es que necesitan tener instalado Acrobat Reader y para muchos usuarios esto no es posible.
Pero con JPedal te permite incluso ver las herramientas del Acrobat Reader dentro de la aplicación Java, facilitando todo un panel de tareas para el pdf a manipular.
Con PrinterJob.lookupPrintServices puedes obtener los servicios de impresion disponibles y de ellos un PrinterJob concreto para uno de ellos.
PrintService[] service = PrinterJob.lookupPrintServices(); PrinterJob printJob = PrinterJob.getPrinterJob(); printJob.setPrintService(service[0]); // Se asigna el tamaño del papel a A4. Paper paper = new Paper(); paper.setSize(595, 842); paper.setImageableArea(0, 0, 595, 842); PageFormat pf = printJob.defaultPage(); pf.setPaper(paper);
Se carga el PDF para ser imprimido. El archivo a imprimir se llama mi_PDF.pdf y se le da formato.
PdfDecoder pdf = null;
pdf = new PdfDecoder(true);
pdf.openPdfFile("mi_PDF.pdf");
pdf.setPageFormat(pf);
Se envía el archivo a imprimir
printJob.setPageable(pdf); printJob.print();
Y para finalizar se cierra el documento.
pdf.closePdfFile();
El ejemplo completo que daría entonces asi:
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterJob;
import javax.print.PrintService;
import org.jpedal.PdfDecoder;
public final void imprimirPDF() {
PdfDecoder pdf = null;
try {
PrintService[] service = PrinterJob.lookupPrintServices();
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintService(service[0]);
Paper paper = new Paper();
paper.setSize(595, 842);
paper.setImageableArea(0, 0, 595, 842);
PageFormat pf = printJob.defaultPage();
pf.setPaper(paper);
pdf = new PdfDecoder(true);
pdf.openPdfFile("mi_PDF.pdf");
pdf.setPageFormat(pf);
printJob.setPageable(pdf);
printJob.print();
} catch (Exception e) {
e.printStackTrace();
} finally {
pdf.closePdfFile();
}
}
El error de una ‘X’ en el centro.
Una razon por la cual se da este error como algunos usuarios comentario, es que, muchas veces se usan librerias de JPenal que no son las correctas.
Solucion por Silvina @Grisel
Hay dos jar que se suelen confundirse y que solo uno de ellos se utiliza: JPedal_Demo.jar y JPedal.jar. En este caso el jar correcto es el JPedal.jar. Este jar puede ser descargado adicionalmente en el siguiente enlace:
http://cfpdf.blogspot.com/2008/09/latest-jpedaljar-for-cfprint-issue.html
Hola esta interesante tu ejemplo, deja te comento que soy novato en java y mi duda es como puedo visualizarlo en un jpanel o jframe, espero me puedas ayudar y te lo agradesco.
Hola daniel,
dificilmente se podria desplegar un pdf en un componente swing asi no mas, al no sin usar una libreria que te lo facilita.
Ya me contaras si necesitas algo mas.
Bueno investigando hay varias librerias y use PDFbox de Apache esta interesante me conto trabajo pero alfin le entendi, surgieron otras dudas pero pronto las publicare para dar un informe mas detallado, Gracias delibertad
gracias a vos por visitar el blog, espero ayudar mas en la proxima
oye ami no me funciona me sale el cuadro de impresion peero no imprime la impresora
me sale una X que cruza toda la pagina, como la piuedo quitar¡
a mi tambien me imprime una cruz en la pagina con el texto del pdf
Hola hola,
pues estoy investigando que seria el error. Si no les molesta podrian adjuntar el codigo para ver que puede ser y asi buscar una pronta soluion.
Pura vida
Hola, Tengo un problema, agradezco a quién me pueda ayudar, soy novata en el tema, y no se en que puedo equivocarme si es jprintJob que está haciendo confusión, al rimprimir el report en PDF no puedo visualizar el texto solo las lineas, este es el código,
public static void main(String[] args) throws Exception {
try{
JasperReport jasperReporte;
HashMap hm = new HashMap ();
hm.put(“Str”, “xxxx”);
jasperReporte = JasperCompileManager.compileReport(“ruta_del_fichero .jrxml”);
JasperPrint print = JasperFillManager.fillReport(jasperReporte, hm, new JREmptyDataSource());
byte[] bytes = JasperExportManager.exportReportToPdf(print);
PrinterJob printJob = PrinterJob.getPrinterJob();
// Asigno el tamaño del papel (A4)
Paper paper = new Paper();
paper.setSize(595, 842);
paper.setImageableArea(0, 0, 595, 842);
PageFormat pf = printJob.defaultPage();
pf.setPaper(paper);
paper.setImageableArea(0, 0, 595, 842);
// Cargo el PDF para imprimir
PdfDecoder pdf = null;
pdf = new PdfDecoder(true);
pdf.openPdfArray(bytes);
pdf.setPageFormat(pf);
// Mando imprimir
//printJob.setPageable(pdf);
if(printJob.printDialog()) {
printJob.setPrintable(pdf);
printJob.print();
} }catch (Exception e) {
}}
}
Hola gente. Lo que no logro ver es la barra de herramientas porque no aparece ninguna interfaz gráfica, luego todo ok.
Hola amigos, tengo un pequeño problema con la impresión de un reporte, he hecho y re-hecho una y otra vez el reportes y no encuentro solución =( por favor alguien que me pueda ayudar, porque ya no se que mas hacer.
Estoy utilizando la libreria de JasperReport, si puedo mandarlo a imprimir y todo bien, pero el detalle es que lo envio hacia una impresora matricial (EPSON LX-300+) y las letras me salen montadas y no se entiende mucho, luego lo hice de otra forma y ya arregle lo de las letras, ahora ya aparecen bien pero me las imprime como si la impresora ya no tubiera tinta (Y la cinta es nueva =S) como puedo configurar ese pequeño problema.
ALGUIEN QUE ME AYUDE POR FAVOR. (Por cierto si exporto el reporte a PDF y luego lo habro desde el Windows en el FoxitReader y lo mando a imprimir, la letra me sale perfectamente, asi que ya descarte la idea de que sea el impresor el malo)