Insérer une image avec itext

Insérer une image avec itext - Java - Programmation

Marsh Posté le 26-11-2008 à 09:54:12    

Bonjour,
J'essaie d'insérer une image avec itext, mais je n'y arrive pas. Voiçi le bot de mon code :
-----------------------------------------------------
Paragraph p9 = new Paragraph();
p9.add(new Phrase("Commentaires : ", new Font(Font.HELVETICA, 10, Font.NORMAL, Color.decode("#0052AD" ))));
p9.add("\n\n" );
document.add(p9);
Image image = Image.getInstance("images/information.png" );
document.add(image);
----------------------------------------------------
 
Le serveur web (Tomcat) m'affiche l'erreur suivante :  
---------------------------------------------------
org.apache.jasper.JasperException: "getOutputStream()" a déjà été appelé pour cette réponse
 org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:460)
 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:367)
 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
 org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
 org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:274)
 org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:254)
 org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:309)
 org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
 org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
 org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 
 
cause mère  
 
java.lang.IllegalStateException: "getOutputStream()" a déjà été appelé pour cette réponse
 org.apache.catalina.connector.Response.getWriter(Response.java:607)
 org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:196)
 org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
 org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
 org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:173)
 java.io.PrintWriter.newLine(Unknown Source)
 java.io.PrintWriter.println(Unknown Source)
 java.io.PrintWriter.println(Unknown Source)
 java.lang.Throwable.printStackTrace(Unknown Source)
 org.apache.struts.taglib.tiles.InsertTag$InsertHandler.processException(InsertTag.java:947)
 org.apache.struts.taglib.tiles.InsertTag$InsertHandler.doEndTag(InsertTag.java:914)
 org.apache.struts.taglib.tiles.InsertTag.doEndTag(InsertTag.java:473)
 org.apache.jsp.jsp.common.defaultPage_jsp._jspx_meth_tiles_005finsert_005f0(defaultPage_jsp.java:455)
 org.apache.jsp.jsp.common.defaultPage_jsp._jspx_meth_c_005fif_005f0(defaultPage_jsp.java:411)
 org.apache.jsp.jsp.common.defaultPage_jsp._jspx_meth_html_005fhtml_005f0(defaultPage_jsp.java:258)
 org.apache.jsp.jsp.common.defaultPage_jsp._jspService(defaultPage_jsp.java:113)
 org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
 org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
 org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:274)
 org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:254)
 org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:309)
 org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
 org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
 org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
-------------------------------------------------------------------------------------------

Reply

Marsh Posté le 26-11-2008 à 09:54:12   

Reply

Marsh Posté le 26-11-2008 à 10:25:48    

Citation :

java.lang.IllegalStateException: "getOutputStream()" a déjà été appelé pour cette réponse


 
L'erreur n'a rien à voir avec iText mais plus avec ce que tu fais après.
 
en effet, une requette Http ne peut avoir qu'une réponse, soit tu retourne un PDF, soit tu affiches une page.
 
Ici tu veux retourner un PDF, donc il n'y a pas de page, donc pas de forward à la fin de ton action.
 
D'une façon générale, dans une action struts, si on joue avec l'OutputStream de la reponse, on doit retourner null.
 

Code :
  1. // dans une action struts
  2. public ActionForward doExecute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) throws {
  3.  
  4.   // on manipule directement la réponse
  5.   OutputStream out = response.getOutputStream();
  6.   ...
  7.   // pas de return mapping.findForward(....);
  8.   return null;
  9. }

Reply

Marsh Posté le 26-11-2008 à 10:41:26    

C'est déjà le cas je retourne null. voiçi mon action :
------------------------------------------------------------------------
public ActionForward editionPdf(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
  throws Exception {
  ActionBean actionBean = (ActionBean) request.getSession().getAttribute("actionBeanForUpdate" );
  Document document = new Document(PageSize.A4);
  try {
  response.setContentType("application/pdf" );
   String fileName = "DetailAction"+actionBean.getCodeAction()+".pdf";
   response.addHeader("Content-disposition", "attachment; filename=\"" + fileName +"\"" );
   PdfWriter.getInstance(document, response.getOutputStream());
   // DEBUT DU DOCUMENT
   document.open();
   Paragraph p9 = new Paragraph();
   p9.add(new Phrase("Commentaires : ", new Font(Font.HELVETICA, 10, Font.NORMAL, Color.decode("#0052AD" ))));
   p9.add("\n\n" );
   document.add(p9);
   Image image = new Image.getInstance("http://forum-images.hardware.fr/icones/smilies/pt1cable.gif" );
   document.add(image);
   }catch(DocumentException de) {
            de.printStackTrace();
            System.err.println("document: " + de.getMessage());
  }
     document.close();
  return null;
 }
----------------------------------------------------------------------------
 
Il n y a rien d'anormal

Reply

Marsh Posté le 26-11-2008 à 14:22:11    

Citation :

java.lang.IllegalStateException: "getOutputStream()" a déjà été appelé pour cette réponse
 org.apache.catalina.connector.Response.getWriter(Response.java:607)
 org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:196)
 org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
 org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
 org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:173)
 java.io.PrintWriter.newLine(Unknown Source)
 java.io.PrintWriter.println(Unknown Source)
 java.io.PrintWriter.println(Unknown Source)
 java.lang.Throwable.printStackTrace(Unknown Source)
 org.apache.struts.taglib.tiles.InsertTag$InsertHandler.processException(InsertTag.java:947)
 org.apache.struts.taglib.tiles.InsertTag$InsertHandler.doEndTag(InsertTag.java:914)
 org.apache.struts.taglib.tiles.InsertTag.doEndTag(InsertTag.java:473)
 org.apache.jsp.jsp.common.defaultPage_jsp._jspx_meth_tiles_005finsert_005f0(defaultPage_jsp.java:455)
 org.apache.jsp.jsp.common.defaultPage_jsp._jspx_meth_c_005fif_005f0(defaultPage_jsp.java:411)
 org.apache.jsp.jsp.common.defaultPage_jsp._jspx_meth_html_005fhtml_005f0(defaultPage_jsp.java:258)
 org.apache.jsp.jsp.common.defaultPage_jsp._jspService(defaultPage_jsp.java:113)
 org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
 org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
 org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:274)
 org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:254)
 org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:309)
 org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
 org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
 org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:803)


 
en suivant la stacktrace de bas en haut on peut déduire l'enchainement suivant :
1) une action a été lancée et a priori elle s'est bien terminée (ActionServlet.process)
2) cette action a fait un forward vers un layout (doForward puis processTilesDefinition)
3) ce layout fait intervenir "defaultPage.jsp" et doit faire un template:insert
4) pour une raison X ou Y cet insert se passe mal (processException)
5) comme la réponse à déjà été utilisée, Tomcat n'arrive pas à écrire la stacktrace de cette erreur
    c'est probablement l'action appelée en 1) qui a écrit dans la réponse
 
Peux tu nous montrer le contenu de defaultPage.jsp et comment tout ça est appelé (code html du lien ou bouton qui déclanche tout)

Reply

Marsh Posté le 26-11-2008 à 14:35:19    

Autre chose, tu devrais catcher les exceptions de type IOException (possible lors du response.getOutputStream() et Image.getInstance)
 

Code :
  1. Image image = new Image.getInstance("http://url image" );


ça compile chez toi ça ?
pour moi, le new est en trop (appel de la méthode static Image.getInstance(String))
 

Reply

Marsh Posté le 26-11-2008 à 14:53:22    

Merci pour tes explication bidem. Le new Image ne compile pas chez moi non plus (ça marche bien avec Image.getInstance).
 
Voiçi les contenu des différents fichiers :
 
Struts_config.xml
----------------
....
<form-bean name="editionPdfForm" type="com.proj.jp.vue.form.ActionJpForm"/>
.....
<action path="/editionPdf"
 name="editionPdfForm"
 parameter="action"
 type="com.proj.jp.vue.action.ActionJpAction"
        scope="request"
 validate="false">    
 <forward name="editionPdf" path="editionPdf"/>
</action>
....
 
Tiles.xml
--------
.....
<definition name="reportingList" extends="defaultPanel">
        <put name="content" value="/jsp/reportingList.jsp" />
        <put name="pageId" value="reportingList" />
        <put name="menu" value="non" />
 </definition>
.....
 
Tiles_defs.xml
-------------
<definition name="defaultPage" path="/jsp/common/defaultPage.jsp">
        <!-- pages definitions -->
        <put type="page" name="header" />
        <put type="page" name="content" />
        <put type="page" name="footer" />
         
        <!-- attributes definitions -->
        <put type="string" name="pageId" />
        <put type="string" name="menu" />
</definition>
 
mon action : ActionJpAction.java
--------------------------------
 
ce que j'ai écrit au dessus
 
 
Ma_jsp.jsp
----------
.....
<html:form name="editionPdf" action="/editionPdf.do?action=editionPdf" type="com.proj.jp.vue.form.ActionJpForm">
 <input class="buttom" type="submit" value="Editer" />
</html:form>
....
 
Merci encore une fois bidem

Reply

Marsh Posté le 26-11-2008 à 17:58:46    

J'ai un doute quant au lien entre editionPdf et la stacktrace.
En effet la stacktrace montre clairement qu'il y a un forward fait après l'action.

 

Essaye le code suivant pour être sûr qu'on passe bien par où on pense :

Code :
  1. public ActionForward editionPdf(ActionMapping mapping, ActionForm form,
  2.      HttpServletRequest request, HttpServletResponse response)
  3. throws Exception {
  4.   boolean responseUsed = false; // true ssi response.getOutputStream() a été appelé
  5.   try {
  6.     ActionBean actionBean = (ActionBean) request.getSession().getAttribute("actionBeanForUpdate" );
  7.     Document document = new Document(PageSize.A4);
  8.     response.setContentType("application/pdf" );
  9.     String fileName = "DetailAction"+actionBean.getCodeAction()+".pdf";
  10.     response.addHeader("Content-disposition", "attachment; filename=\"" + fileName +"\"" );
  11.     OutputStream out = response.getOutputStream();
  12.  
  13.     boolean responseUsed = true;
  14.    // à partir d'ici toute exception serait problématique car on ne peut pas laisser struts la gérer
  15.    PdfWriter.getInstance(document, out);
  16.    // DEBUT DU DOCUMENT
  17.    document.open();
  18.    Paragraph p9 = new Paragraph();
  19.    p9.add(new Phrase("Commentaires : ", new Font(Font.HELVETICA, 10, Font.NORMAL, Color.decode("#0052AD" ))));
  20.    p9.add("\n\n" );
  21.    document.add(p9);
  22.    Image image = new Image.getInstance("http://forum-images.hardware.fr/icones/smilies/pt1cable.gif" );
  23.    document.add(image);
  24.    }catch(DocumentException de) {
  25.       System.err.println("Erreur DocumentException" );
  26.       de.printStackTrace();
  27.       System.err.println("document: " + de.getMessage());
  28.    }catch(IOException de) {
  29.       de.printStackTrace();
  30.       System.err.println("Erreur IOException : " + de.getMessage());
  31.    } catch(Exception de) {
  32.       de.printStackTrace();
  33.       System.err.println("Erreur Exception : " + de.getMessage());
  34.       System.err.println("responseUsed == " + responseUsed);
  35.   }
  36.   document.close();
  37.   return null;
  38. }
 

Si tu as l'affichage "responseUsed == true" c'est qu'on a isolé le problème (une exception lancée donc Struts faisait un forward vers la page d'erreur)

 

Si tu n'as pas "Erreur Exception : ...", je sèche ;)


Message édité par Bidem le 26-11-2008 à 18:01:38
Reply

Marsh Posté le 26-11-2008 à 18:10:51    

Effectivement ça génère un exception mais pas de responseUsed.
 
java.net.ConnectException: Connection timed out: connect
 at java.net.PlainSocketImpl.socketConnect(Native Method)
 at java.net.PlainSocketImpl.doConnect(Unknown Source)
 at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
 at java.net.PlainSocketImpl.connect(Unknown Source)
 at java.net.Socket.connect(Unknown Source)
 at java.net.Socket.connect(Unknown Source)
 at sun.net.NetworkClient.doConnect(Unknown Source)
 at sun.net.www.http.HttpClient.openServer(Unknown Source)
 at sun.net.www.http.HttpClient.openServer(Unknown Source)
 at sun.net.www.http.HttpClient.<init>(Unknown Source)
 at sun.net.www.http.HttpClient.New(Unknown Source)
 at sun.net.www.http.HttpClient.New(Unknown Source)
 at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
 at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
 at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
 at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
 at java.net.URL.openStream(Unknown Source)
 at com.lowagie.text.Image.getInstance(Unknown Source)
 at com.lowagie.text.Image.getInstance(Unknown Source)
 at com.Proj.jp.vue.action.ActionJpAction.editionPdf(ActionJpAction.java:542)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
 at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
 at com.Proj.jp.vue.BasicDispatchAction.execute(BasicDispatchAction.java:33)
 at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
 at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
 at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
 at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
 at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
 at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
 at java.lang.Thread.run(Unknown Source)
Erreur IOException : Connection timed out: connect

Reply

Marsh Posté le 27-11-2008 à 10:39:00    

Citation :

java.net.ConnectException: Connection timed out: connect
 ...
 at java.net.URL.openStream(Unknown Source)
 at com.lowagie.text.Image.getInstance(Unknown Source)
 at com.lowagie.text.Image.getInstance(Unknown Source)

 

Voilà on a trouvé l'erreur d'origine, c'est "juste" un problème d'accès à l'URL de l'image.

 

tu est derrière un proxy ?
si oui, il faut configurer le bousin

Code :
  1. Properties properties = System.getProperties();
  2. properties.put("http.proxyHost", "my.proxyhost.com" );
  3. properties.put("http.proxyPort", "1234" );



Message édité par Bidem le 27-11-2008 à 10:39:16
Reply

Marsh Posté le 03-12-2008 à 12:29:06    

ça marche, merci bidem

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed