Mostrando las entradas con la etiqueta pdf. Mostrar todas las entradas
Mostrando las entradas con la etiqueta pdf. Mostrar todas las entradas

lunes, 12 de abril de 2010

Leer un PDF con PDFBox


Hace poco tiempo me tope con la necesidad de leer pdf's desde un servidor para obtener el texto del pdf y sus propiedades, por lo que tuve que investigar con que herramientas podría leer un pdf para convertirlo en un String y después manipular el contenido para obtener solo el texto que me interesaba, me tope con un muy buen blog el cual te explica como hacerlo con PDFBox a mi parecer esta muy entendible y me sirvió para mi propósito, lo único que hice fue modificarlo un poco:
este es el link del blog que mencione anteriormente: http://noelia-java.blogspot.com/2009/07/leer-pdf-desde-java.html

Estas son las clases que genere yo:


/**
*
* @author nany
*/
public class EntidadPDF {
private String titulo;
private String autor;
private int numeroDePaginas;
private String tema;
private String palabrasClave;
private String creador;
private String productor;
private String contenido;//el contenido completo del documento

public String getAutor() {
return autor;
}

public void setAutor(String autor) {
this.autor = autor;
}

public String getContenido() {
return contenido;
}

public void setContenido(String contenido) {
this.contenido = contenido;
}

public String getCreador() {
return creador;
}

public void setCreador(String creador) {
this.creador = creador;
}

public int getNumeroDePaginas() {
return numeroDePaginas;
}

public void setNumeroDePaginas(int numeroDePaginas) {
this.numeroDePaginas = numeroDePaginas;
}


public String getPalabrasClave() {
return palabrasClave;
}

public void setPalabrasClave(String palabrasClave) {
this.palabrasClave = palabrasClave;
}

public String getProductor() {
return productor;
}

public void setProductor(String productor) {
this.productor = productor;
}


public String getTema() {
return tema;
}

public void setTema(String tema) {
this.tema = tema;
}

public String getTitulo() {
return titulo;
}

public void setTitulo(String titulo) {
this.titulo = titulo;
}

}


El método que leera el pdf dada una url esta contenido en al siguiente clase

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.pdfbox.pdfparser.PDFParser;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.pdmodel.PDDocumentInformation;
import org.pdfbox.util.PDFTextStripper;

/**
*
* @author nany
*/
public class ContenedorPDF {

private FileInputStream file = null;
private PDDocument document = null;

/**
* Abre el archivo especificado en la ruta para generar un objeto de tipo EntidadPDF
* @param archivo
* @return
* @throws org.pdfbox.exceptions.CryptographyException
* @throws org.pdfbox.exceptions.InvalidPasswordException
*/
public EntidadPDF convertirAModelo(String archivo) {
EntidadPDF entPdf = new EntidadPDF();
try {

//leemos el pdf del articulo lo efectivo
URL url = new URL(archivo);
InputStream is = url.openStream();

PDFParser parser = new PDFParser(is);

parser.parse();
document = parser.getPDDocument();

//Obtenemos todo el contenido del pdf
PDFTextStripper stripper = new PDFTextStripper();
entPdf.setContenido(stripper.getText(document));


//obtenemos la informacion de las propiedades del pdf
PDDocumentInformation info = document.getDocumentInformation();

entPdf.setTitulo(info.getTitle());
entPdf.setAutor(info.getAuthor());
entPdf.setNumeroDePaginas(document.getNumberOfPages());
entPdf.setTema(info.getSubject());
entPdf.setPalabrasClave(info.getKeywords());
entPdf.setCreador(info.getCreator());
entPdf.setProductor(info.getProducer());


} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {//no se pudo abrir el archivo
e.printStackTrace();
} finally {
if (file != null) {
try {
file.close();
} catch (IOException e) {//no se pudo cerrar el archivo
e.printStackTrace();
}
}
if (document != null) {
try {
document.close();
} catch (IOException e) {//no se pudo cerrar el documento
e.printStackTrace();
}
}
}

return entPdf;
}


}

Bien espero y le sea de ayuda, le dejo otro link de otras librerías que permiten la manipulación del pdf
http://www.qoppa.com/Enlace

martes, 16 de junio de 2009

Itex en una aplicación web (Generar pdf)

Por fin encontré como enviar un documento pdf generado de manera dinámica desde el servidor al cliente, pues resulta que encontré un código en la web que según lo hacia pero tenia un linea mal y quizás la mas importante por lo general cuando llamamos a un servlet lo hace por metodo

public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{....}

el cual realiza una acción según sea el caso puede responder con texto plano, html, xml, json ect, pero también puede ocupar el método

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}

También puede responder de la misma manera que goGet, si nosotros queremos responder con html,json, xml, texto plano, o con un pdf que es al final de cuentas es resp.setContentType("application/pdf") que es un objeto de tipo HttpServletResponse resp que es lo que el servlet de responderá al cliente, como nosotros no sabemos como un cliente puede solicitar nuestro pdf nosotros tendremos que generar un método para ambos

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}

Que en el caso de netbeans lo hace al crear un servlet, bueno si lo hacen con netbeans borren lo que tenga dentro de ese metodo.

El código es el siguiente:


package pdf.servlet;



import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfWriter;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Paragraph;


/**
*
* @author isaac
*/

public class CrearPdf extends HttpServlet {

/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.

* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

try {

response.setContentType("application/pdf"); // Code 1
Document document = new Document();
PdfWriter.getInstance(document,response.getOutputStream()); // Code 2
document.open();
float[] widths = {25f, 25f, 20f,15f,15f};
PdfPTable table = new PdfPTable(5); //Code 3
table.setHorizontalAlignment(Element.ALIGN_LEFT);
table.setWidthPercentage(100);
PdfPCell cell =new PdfPCell(new Paragraph("Prueba"));
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setColspan(5);
table.addCell(cell);
table.addCell("Scanned Fax FileName");
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell("Corporate Name");
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell("Corporate Account");
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell("Credit");
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell("Debit");
cell.setHorizontalAlignment(Element.ALIGN_CENTER);



document.add(table);
document.close();

}catch(DocumentException e){
e.printStackTrace();
}catch (Exception e) {

// TODO: handle exception

}
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}



/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}


/**
* Returns a short description of the servlet.
* @return a String containing servlet description
*/

@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>

}

El web.xml es el siguiente en el caso de Netbeans no es necesario puesto que lo mapea cuando creas el servlet.

<servlet>
<servlet-name>CrearPdf</servlet-name>
<servlet-class>pdf.servlet.CrearPdf</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>CrearPdf</servlet-name>
<url-pattern>/creaPdf</url-pattern>
</servlet-mapping>

y final mente run...