El origen del problema
No hace mucho, hice un pequeño proyecto para generar informes PDF a través de JSP, lo cual me abrió los ojos. Parte de la información de la empresa genera informes HTML a través de la red. Aunque IE puede imprimir directamente el contenido que se muestra en él, desde el punto de vista de la interfaz, si los resultados de la visualización HTML se imprimen directamente, no se ve muy hermoso. Si lo convierte a un archivo PDF y luego lo imprime, el efecto de impresión será mucho mejor.
Introducción a iText
iText es una biblioteca de clases Java de código abierto que se puede utilizar para generar archivos PDF fácilmente. Puede descargar la última versión de la biblioteca de clases visitando http://sourceforge.net/project/showfiles.php?group_id=15255&release_id=167948. Una vez completada la descarga, obtendrá un paquete .jar. el classpath JDK para usarlo. Si es necesario que aparezcan caracteres chinos, japoneses y coreanos en el archivo PDF generado, también deberá descargar el paquete iTextAsian.jar visitando http://itext.sourceforge.net/downloads/iTextAsian.jar .
En cuanto al uso de la biblioteca de clases iText, http://www.lowagie.com/iText/tutorial/index.html tiene un tutorial más detallado. Este tutorial comienza desde el principio e introduce sistemáticamente los métodos y técnicas para colocar texto, imágenes, tablas, etc. en archivos PDF. Después de leer este tutorial, podrá crear desde archivos PDF desde simples hasta complejos. Sin embargo, intentar solucionar todas las dificultades encontradas en el proceso de generación de archivos PDF a través de tutoriales es sin duda un lujo. Por lo tanto, es muy importante leer la documentación de la API de iText. Cuando los lectores descargan la biblioteca de clases, también pueden descargar la documentación de la biblioteca de clases.
Cómo utilizar iText para generar informes PDF en un programa Java
El siguiente es el ejemplo más simple del tutorial anterior. Este ejemplo muestra el marco general del programa para generar archivos PDF a través de iText. Los lectores solo necesitan agregar el contenido que desean colocar en el archivo PDF entre las dos declaraciones document.open() y document.close();. Este ejemplo solo agrega una línea de texto "Hola mundo" al archivo PDF.
Documento documento = nuevo documento();
intente
{
PdfWriter.getInstance(documento, nuevo FileOutputStream ("Chap0101.pdf"));
document.open
(
);
document.add(new Paragraph("Hola mundo"));
DocumentException de)
{
System.err.println(de.getMessage())
;
catch(IOException ioe)
{
System.err.println(ioe.getMessage()
}
document.close
();
En el ejemplo anterior, el marco del programa es muy claro y sencillo. Sin embargo, especificar la ubicación de texto, imágenes y tablas en PDF es una tarea muy problemática. Aparte del proceso de modificar constantemente la posición en el programa, luego ejecutar el programa, generar el archivo PDF y observar si la posición de los elementos en el PDF es razonable, no parece haber otro método mejor.
Cómo generar informes PDF a través de JSP
no está disponible en los tutoriales de iText y hay relativamente poca información relevante en Internet. Una vez vi a alguien publicando en CSDN pidiendo detalles de implementación, y alguien respondió sobre el principio de implementación: primero generar un archivo PDF en el servidor y luego el usuario elige descargarlo o abrirlo haciendo clic en el hipervínculo que apunta al archivo PDF. Esta es una idea, o una de las ideas. Este artículo realiza esta idea y da otra idea y la implementa de dos maneras.
1) Genere archivos PDF directamente en el servidor.
<%@ importación de página ="com.lowagie.text.*,com.lowagie.text.pdf.*, java.io.*"%>
<%
Nombre de archivo de cadena = "PDF"+(new Random()).nextInt ()+".pdf" ;
Documento documento = nuevo Documento(PageSize.A4);
ServletOutputStream
out1 = respuesta.getOutputStream();
intente
{
PdfWriter escritor = PdfWriter.getInstance(documento, nuevo FileOutputStream(nombre de archivo) );
);
document.add(new Paragraph("Hola mundo"));
document.close()
}
catch(Exception e){}%>;
El programa anterior genera un archivo PDF estático en el servidor. Obviamente, el nombre del archivo PDF obtenido en cada ejecución debe ser único y no duplicado. Este programa utiliza una función aleatoria para nombrar los archivos PDF generados. La desventaja de este programa es que cada vez que se ejecuta, se generará un archivo PDF en el servidor. Si no se elimina a tiempo, el número aumentará cada vez más. Esto es obviamente algo que el responsable del sitio no quiere. ver.
2) Transfiera el archivo PDF al caché del cliente en forma de secuencia. La ventaja de esto es que no dejará ninguna "reliquia" en el servidor.
i) Generar directamente a través de la página JSP
<%@
página import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
<%
respuesta.setContentType( "aplicación/pdf" );
Documento documento = nuevo Documento();
ByteArrayOutputStream buffer = nuevo ByteArrayOutputStream();
PdfWriter
escritor=PdfWriter.getInstance( documento, buffer )
;
document.close();
salida de DataOutput = new DataOutputStream(respuesta.getOutputStream());
byte
[] bytes = buffer.toByteArray();
respuesta.setContentLength(bytes.length);
longitud; i++)
{
salida.writeByte( bytes[i]
}
%>
ii) Generado a través de Servlet
importar java.io.*;
importar javax.servlet.*;
importar javax.servlet.http.*;
importar com.lowagie.text.*;
importarcom.lowagie.text.pdf
.*;
Respuesta HttpServletResponse)
arroja IOException,ServletException
{
Documento documento = nuevo Documento (PageSize.A4, 36,36,36,36);
ByteArrayOutputStream
ba = nuevo ByteArrayOutputStream();
intente
{
PdfWriter escritor = PdfWriter.getInstance(document, ba);
.open();
document.add(new Paragraph("Hola mundo"));
}
catch(DocumentException de)
{
de.printStackTrace()
;
}
document.close();
respuesta.setContentType
(
"
aplicación/pdf");
respuesta.setContentLength(ba.size
());
()
;
Terminé
usando el segundo enfoque en mi proyecto. El código fuente de este artículo ha sido depurado en mi tomcat4. Espero que pueda brindar comodidad a todos.
Todos pueden usarlo. Si necesita reimprimirlo, indique la fuente.