PDFViewer
Pues efectivamente tendremos que hacer algunas implementaciones para lo del PDF, sin embargo la solución está decidida, trabajaremos con JPedal y la impresión se tendrá que implementar por completo en una forma posterior...
JPedal fue el componente que logró mostrar mejro los PDFs, no requirió de un engine nativo o de paga para los fonts y las imagenes las escala correctamente en el PDF...
La solución es implementada dentro de un JPanel al cual se le pasa el nombre del archivo y la página a desplegar, esta viene de acuerdo con la búsqueda realizada por el usuario de acuerdo a su tema, las palabras claves y demás factores que intervengan en la misma.
import java.awt.Component;
import java.awt.Dimension;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JScrollPane;
import org.jpedal.PdfDecoder;
import org.jpedal.exception.PdfException;
public VisorPDF(String documento, Dimension dimension) {
initComponents();
this.setSize(dimension);
/***************************************************
* ********** **************
* ********** JPEDAL **************
* ********** **************
* *************************************************
*/
PdfDecoder pdfDecoder = new PdfDecoder(true);
//ensure non-embedded font map to sensible replacements
this.setLayout(new BorderLayout());
PdfDecoder.setFontReplacements(pdfDecoder);
visorDocumento = pdfDecoder;
try {
visorDocumento.openPdfFile(documento);
} catch (PdfException ex) {
Logger.getLogger(VisorPDF.class.getName()).log(Level.SEVERE, null, ex);
}
JScrollPane currentScroll = new JScrollPane();
currentScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
currentScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
currentScroll.setViewportView(pdfDecoder);
pdfDecoder.setPageParameters(1.5f,1); //values scaling (1=100%). page number
pdfDecoder.invalidate();
contenido = currentScroll;
contenido.setSize(dimension);
contenido.repaint();
visorDocumento.setSize(dimension);
visorDocumento.repaint();
this.add(contenido);
}
public void setVerPanel(boolean value){
try {
visorDocumento.setVisible(value);
visorDocumento.repaint();
} catch (Exception ex) {
Logger.getLogger(VisorPDF.class.getName()).log(Level.SEVERE, null, ex);
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
setOpaque(false);
addComponentListener(new java.awt.event.ComponentAdapter() {
public void componentResized(java.awt.event.ComponentEvent evt) {
formComponentResized(evt);
}
public void componentShown(java.awt.event.ComponentEvent evt) {
formComponentShown(evt);
}
});
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 300, Short.MAX_VALUE)
);
}// </editor-fold>
private void formComponentResized(java.awt.event.ComponentEvent evt) {
if(contenido!=null) {
contenido.setSize(this.getSize());
visorDocumento.setSize(this.getSize());
visorDocumento.setPageParameters((float)(this.getSize().getWidth()/400),1);
visorDocumento.setVisible(false);
visorDocumento.setVisible(true);
}
}
private void formComponentShown(java.awt.event.ComponentEvent evt) {
if(contenido!=null) contenido.setSize(this.getSize());
}
// Variables declaration - do not modify
// End of variables declaration
public void irAPagina(int pagina) {
try {
visorDocumento.decodePage(pagina);
visorDocumento.repaint();
} catch (Exception ex) {
Logger.getLogger(VisorPDF.class.getName()).log(Level.SEVERE, null, ex);
}
}
public int getPaginaActual(){
int resultado=0;
try {
resultado = visorDocumento.getlastPageDecoded();
} catch (Exception ex) {
Logger.getLogger(VisorPDF.class.getName()).log(Level.SEVERE, null, ex);
}
return resultado;
}
}
Como se puede observar lo importante para JPedal es la clase PdfDecoder, esta es la encargada de hacer un componente que pinta el PDF, lo que nosotros hacemos es que ponemos dicho componente dentro de un JPanel a fin de desplegarlo, el panel al momento de ser redimensionado hace que el zoom del PDF se modifique mediante la línea visorDocumento.setPageParameters((float)(this.getSize().getWidth()/400),1);
No es nada complejo, como se puede apreciar, usar este control, una vez hecho esto para imprimirlo tendremos que tomar el panel y utilizar las herramientas de impresión propias de Swing/awt encontrando el zoom adecuado para hacer coincidir nuestro PDF con el amaño de página buscado.
Seguiremos informando.
- charlymex's blog
- Inicie sesión o regístrese para enviar comentarios
Comentarios
ICEPdf puede imprimir... JPedal de paga? o LGPL?
ICEPdf puede imprimir... JPedal no?
La edicion LGPL? O la de paga?
JPanel: Stream en vez de nombre de archivo
No seria mucho mas generico y reutilizable si en vez de que el JPanel recibiera de parametro la cadena del nombre de archivo, recibiera un Stream? asi no amarras a tu componente a tener que leer PDFs de una ruta fisica local, pudes leerlos de cualquier lugar a donde puedas abrir un stream (local, en la red, en un BLOB en una base de datos, como resultado de un algoritmo de generacion de PDF basado en iText, etc)
(Espero que la razon por la que lo haces asi no sea que el API de JPedal este limitada y no te deja trabajar mas que con streams )
Fue la LGPL
La de paga si soporta impresión pero el precio es impresionantemente absurdo y las regalías que cobran por distribución peor.
Stream vs filename
En principio se hizo así por que el API que se observó por parte de JPedal ya tiene la funcionalidad de que pases el parámetro del nombre del archivo, lo que se utilizará el 90% de las veces, ya que como les mencionaba son libros electrónicos y los contenidos son estáticos.
Para reportes sobre resultados de búsquedas es muy probable que usemos Jasper, de ser necesario usar JPedal en algún momento seguramente estaríamos manejando streams, pero en cualquier caso no se generan PDFs "para guardar" al vuelo por lo que dudo que lo requiramos, así que el punto fue que si ellos ya se pelearon con encontrar la forma óptima de manejar los streams de los archivos, para que reinventar esa parte....