L'origine du problème.
Il n'y a pas si longtemps, j'ai réalisé un petit projet visant à générer des rapports PDF via JSP, ce qui m'a ouvert les yeux. Certains formulaires d'information de l'entreprise génèrent des rapports HTML via le réseau. Bien qu'IE puisse imprimer directement le contenu qui y est affiché, du point de vue de l'interface, si les résultats de l'affichage HTML sont directement imprimés, cela n'est pas très beau. Si vous le convertissez en fichier PDF puis l'imprimez, l'effet d'impression sera bien meilleur.
Introduction à iText
iText est une bibliothèque de classes Java open source qui peut être utilisée pour générer facilement des fichiers PDF. Vous pouvez télécharger la dernière version de la bibliothèque de classes en visitant http://sourceforge.net/project/showfiles.php?group_id=15255&release_id=167948 Une fois le téléchargement terminé, vous obtiendrez un package .jar. Ajoutez ce package à. le chemin de classe JDK pour l'utiliser. Si des caractères chinois, japonais et coréens doivent apparaître dans le fichier PDF généré, vous devez également télécharger le package iTextAsian.jar en visitant http://itext.sourceforge.net/downloads/iTextAsian.jar .
Concernant l'utilisation de la bibliothèque de classes iText, http://www.lowagie.com/iText/tutorial/index.html propose un tutoriel plus détaillé. Ce didacticiel commence depuis le début et présente systématiquement les méthodes et techniques de placement de texte, d'images, de tableaux, etc. dans des fichiers PDF. Après avoir lu ce didacticiel, vous serez en mesure de créer des fichiers PDF simples à complexes. Cependant, tenter de résoudre toutes les difficultés rencontrées dans le processus de génération de fichiers PDF grâce à des tutoriels est sans aucun doute un luxe. Par conséquent, il est très important de lire la documentation de l’API iText. Lorsque les lecteurs téléchargent la bibliothèque de classes, ils peuvent également télécharger la documentation de la bibliothèque de classes.
Comment utiliser iText pour générer des rapports PDF dans un programme Java.
Voici l'exemple le plus simple du didacticiel ci-dessus. Cet exemple décrit le cadre général du programme pour générer des fichiers PDF via iText. Les lecteurs doivent simplement ajouter le contenu qu'ils souhaitent mettre dans le fichier PDF entre les deux instructions document.open(); et document.close();. Cet exemple ajoute uniquement une ligne de texte « Hello World » au fichier PDF.
Document document = new Document();
try
{
PdfWriter.getInstance(document, new FileOutputStream ("Chap0101.pdf"));
document.open
(
);
document.add(new Paragraph("Hello World"));
DocumentException de)
{
System.err.println(de.getMessage());
}
catch(IOException ioe)
{
System.err.println(ioe.getMessage()
}
document.close
();
exemple ci-dessus, le cadre du programme est très clair et simple. Cependant, spécifier l'emplacement du texte, des images et des tableaux dans un PDF est une tâche très fastidieuse. Outre le processus consistant à modifier constamment la position dans le programme, puis à exécuter le programme, à générer le fichier PDF et à observer si la position des éléments dans le PDF est raisonnable, il ne semble pas y avoir d'autre meilleure méthode.
La manière de générer des rapports PDF via JSP
n'est pas disponible dans les didacticiels iText et il existe relativement peu d'informations pertinentes sur Internet. J'ai vu une fois quelqu'un poster sur CSDN demandant des détails d'implémentation, et quelqu'un a répondu sur le principe d'implémentation : générez d'abord un fichier PDF sur le serveur, puis l'utilisateur choisit de le télécharger ou de l'ouvrir en cliquant sur le lien hypertexte pointant vers le fichier PDF. C'est une idée, ou une des idées. Cet article réalise cette idée et donne une autre idée et la met en œuvre de deux manières.
1) Générez des fichiers PDF directement sur le serveur.
<%@ page import ="com.lowagie.text.*,com.lowagie.text.pdf.*, java.io.*"%>
<%
String filename = "PDF"+(new Random()).nextInt ()+".pdf" ;
Document document = new Document(PageSize.A4);
ServletOutputStream
out1 = réponse.getOutputStream();
try
{
PdfWriterwriter = PdfWriter.getInstance(document, new FileOutputStream(filename) );
);
document.add(new Paragraph("Hello World"));
document.close();
}
catch(Exception e){}%>
Le programme ci-dessus génère un fichier PDF statique sur le serveur. Évidemment, le nom du fichier PDF obtenu à chaque exécution doit être unique et non dupliqué. Ce programme utilise une fonction aléatoire pour nommer les fichiers PDF générés. L'inconvénient de ce programme est qu'à chaque exécution, un fichier PDF sera généré sur le serveur. S'il n'est pas supprimé à temps, le nombre deviendra de plus en plus grand. C'est évidemment quelque chose que le responsable du site ne souhaite pas. voir.
2) Transférez le fichier PDF dans le cache du client sous forme de flux. L'avantage est que cela ne laissera aucune « relique » sur le serveur.
i) Générer directement via la page JSP
<%@
page import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
<%
réponse.setContentType( "application/pdf" );
Document document = new Document();
ByteArrayOutputStream
buffer = new ByteArrayOutputStream(
)
;
document.close();
DataOutput sortie = new DataOutputStream( réponse.getOutputStream() );
byte[] octets = buffer.toByteArray();
réponse.setContentLength
(bytes.length);
longueur; i++ )
{
sortie.writeByte( octets[i]
}
%>
ii) Généré via Servlet
importer java.io.*;
importer javax.servlet.*;
importer javax.servlet.http.*;
importer
com.lowagie.text.pdf
.*;
Réponse HttpServletResponse)
lance IOException,ServletException
{
Document document = new Document (PageSize.A4, 36,36,36,36);
ByteArrayOutputStream ba = new ByteArrayOutputStream ();
try
{
PdfWriterwriter = PdfWriter.getInstance (document, ba)
; .open();
document.add(new Paragraph("Hello World"));
}
catch(DocumentException de)
{
de.printStackTrace();
System.err.println("Une erreur de document :" +de.getMessage()); );
}
document.close();
réponse.setContentType
(
"application/pdf");
réponse.setContentLength(ba.size
());
();
}
fini par
utiliser la deuxième approche dans mon projet. Le code source de cet article a été débogué sur mon tomcat4. J'espère que cela pourra apporter du confort à tout le monde.
Tout le monde est invité à l’utiliser. Si vous devez le réimprimer, veuillez en indiquer la source.