servlet, pdf, internet explorer

servlet, pdf, internet explorer - Java - Programmation

Marsh Posté le 22-11-2004 à 23:11:02    

Salut,
 
Il semblerait que ce cher IE ait un problème pour ouvrir les pdf si on ne spécifie pas de content-length dans les entetes http. Or, si ce pdf est généré à la volée, on ne le connait pas d'avance. Je vois deux possibilités:
- bufferer tout le bordel generé en mémoire, et rebalancer tout le byte[] une fois qu'on en connait la longueur, avec le content-length bien setté.  
Mon collègue à choisi cet approche, et jme demande si c'est pas (entre autres joyeusetés made in lui) grace à ça qu'on mange des OutOfMemory a tout bout de champ [:itm]
 
- balancer le stream de mon pdf generé sur le file system, puis une fois ce fichier generé (dans un repertoire temporaire), je peux aussi, forcément, en connaitre la longueur, et donc setter le content-length correctement: je pense essayer cet approche; même si je suis pas fan, c'est la seule que je vois pour l'instant pour contrer ce cher IE.
 
Si qqun à des suggestions, une meilleure idée, ou voit un problème avec cette deuxième approche, je suis preneur :)  
 
:hello:

Reply

Marsh Posté le 22-11-2004 à 23:11:02   

Reply

Marsh Posté le 22-11-2004 à 23:21:35    

il n'y a pas de streaming possible avec le pdf (enfin à ma connaissance...), donc la deuxième solution est très bien... quoique le mieux serait de ne pas limiter en mémoire la jvm dans le serveur d'app et de booster les machines de prod en ram [:itm]
 
au fait, bon anniversaire [:kahn21] [:popok] [:taiche]


Message édité par schnapsmann le 22-11-2004 à 23:31:24
Reply

Marsh Posté le 22-11-2004 à 23:37:22    

le -Xmx de cette jvm est à 256M, alors que le pdf produit doit peser +/-2 mo ... [:icon9]
 
(avec un pdf de 200k ça passe mais c'est lent [:itm])


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 22-11-2004 à 23:39:47    

the real moins moins a écrit :

le -Xmx de cette jvm est à 256M, alors que le pdf produit doit peser +/-2 mo ... [:icon9]
 
(avec un pdf de 200k ça passe mais c'est lent [:itm])


faut faire péter plus de mémoire, s'il y a 200 requetes de génération de pdf de 2Mo en même temps, ça rentre pas dans 256Mo [:jagstang]

Reply

Marsh Posté le 22-11-2004 à 23:51:19    

meme avec une 1 seule requete ça rentre pas, là [:petrus75]
 
 
(et euh, les 200 requetes, elles attendront dans le dispatcher du thread pool nan? [:petrus75])


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 22-11-2004 à 23:55:52    

the real moins moins a écrit :

meme avec une 1 seule requete ça rentre pas, là [:petrus75]


[:jean-guitou]
 

the real moins moins a écrit :

(et euh, les 200 requetes, elles attendront dans le dispatcher du thread pool nan? [:petrus75])


ouais sur un serveur configuré petit joueur http://www.microserfs.net/HFR/petrus/cupetrus.gif

Reply

Marsh Posté le 22-11-2004 à 23:58:36    

bon annif mwin mwin http://simogeo.free.fr/hfr/petruscube.gif


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 22-11-2004 à 23:59:40    

pourquoi il est tout moche ce petrus ?

Reply

Marsh Posté le 23-11-2004 à 00:11:05    

the real moins moins a écrit :

Il semblerait que ce cher IE ait un problème pour ouvrir les pdf si on ne spécifie pas de content-length


ca me parait suspect ...
t'es sûr de toi ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 23-11-2004 à 00:12:35    

chrisbk a écrit :

pourquoi il est tout moche ce petrus ?


 
j'ai du chier l'export en gif ... mais bon, spa très grave pour un petrus  :ange:


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 23-11-2004 à 00:12:35   

Reply

Marsh Posté le 23-11-2004 à 00:15:19    

un petrus, c'est bleu, merde [:petrus75]

Reply

Marsh Posté le 23-11-2004 à 00:23:37    

benou a écrit :

ca me parait suspect ...
t'es sûr de toi ?

oui.
 
http://www.lowagie.com/iText/faq.html#msie
 
(il semblerait qu'il y ait d'autres "solutions", mais aucune n'est réellement explicable)


Message édité par the real moins moins le 23-11-2004 à 00:26:18
Reply

Marsh Posté le 23-11-2004 à 00:25:35    

chrisbk a écrit :

un petrus, c'est bleu, merde [:petrus75]


 
un petrus, c'est laid, merde [:aloy]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 23-11-2004 à 00:29:42    

http://www.lgml.net/HFR/petrus_blink.gif
[:sisicaivrai]


Message édité par Taiche le 23-11-2004 à 00:30:11

---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 23-11-2004 à 00:31:47    


 
 [:cyriadis]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 23-11-2004 à 00:32:59    

vous etes lourds http://rulzofpunk.free.fr/smileys/fouhello.gif


Message édité par the real moins moins le 23-11-2004 à 00:33:43
Reply

Marsh Posté le 23-11-2004 à 00:34:08    


\o/
:jap:


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 23-11-2004 à 00:34:46    

Bonnanif taiche [:udok]

Reply

Marsh Posté le 23-11-2004 à 00:35:26    

Enfin quelqu'un qui y pense [:atsuko]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 23-11-2004 à 08:14:24    

j'avais le meme pb que toi avec IE mais j'ai opté pour la 1ere solution qui me parrait plus "clean".
 

Code :
  1. response.setContentType("application/pdf" );
  2. ByteArrayOutputStream ba = new ByteArrayOutputStream();
  3. pdf.render(ba);
  4. response.setContentLength(ba.size());
  5. ba.writeTo(response.getOutputStream());
  6. response.getOutputStream().flush();

Reply

Marsh Posté le 23-11-2004 à 08:48:49    

de toute façon y a pas trop le choix ... faut bien le générer pour onnaître sa taille finale, et vu qu'il faut envoyer la taille avant le contenu lui-même, faut forcément le générer entièrement pour connaître sa taille.
 
Y a une 2e alternative si tu es vraiment à l ramasse côté mémoire, c'est de générer 2 fois le fichier : la première fois dans un Stream qui ne fait que de compter la taille, la deuxième fois en balançant ca dans stream de la réponse.
 
Si tu fais ca, vérifit quand même que ton moteur de servlet ne bufferise pas le tout par derrière ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 23-11-2004 à 10:32:19    

laser > ben c'est ce qu'on fait pour l'instant, et un byte[] de 2mo ou +, ça semble pas etre une super idée.
 
benou > bah euh ouais c'est ma 2e solution, sauf que je compte pas surcharger le serveur inutilement en generant le pdf une 2e fois...

Reply

Marsh Posté le 23-11-2004 à 15:21:43    

et hop, un petit coup de balais et le pdf fais 15% de la taille qu'il faisait ce matin avec les meme données \o/

Reply

Marsh Posté le 23-11-2004 à 16:11:37    

oki
c'est clair que 2 mo c'est un peu gros.
ceux que je génére habituellement tournent autour de 500ko (10 pages environ dont une sur deux avec images etc...)
 
sinon la 2eme soluce me parrait un peu galere car tu devra certaiement identifier de maniere unique les pdf que tu crées etc... :/
 
sinon autre solution, tu interdit l'utilisation d'IE  :lol:

Reply

Marsh Posté le 23-11-2004 à 16:14:58    

euh, identifier de maniere unique: pas compliqué de generer une GUID, pas compliqué de s'assurer que le fichier n'existe pas au moment de le créer, pas compliqué de le virer apres, bref, pas compliqué :D

Reply

Marsh Posté le 23-11-2004 à 16:17:35    

mais c'est un peu dommage quand meme :)
 
ps : je suis un partisant de la "loi du moindre effort"  :lol:

Reply

Marsh Posté le 23-11-2004 à 20:22:45    

the real moins moins a écrit :

pas compliqué de s'assurer que le fichier n'existe pas au moment de le créer

je sors ma pelle à clous ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 23-11-2004 à 20:36:51    

the real moins moins a écrit :

Il semblerait que ce cher IE ait un problème pour ouvrir les pdf si on ne spécifie pas de content-length dans les entetes http.  


 
Faudra que je vérifie sur la servlet toute conne que j'ai faite le mois passé mais je ne me souviens pas avoir foutu un header quelconque :o

Reply

Marsh Posté le 23-11-2004 à 20:43:09    

nraynaud a écrit :

je sors ma pelle à clous ?

fais pas chier, je fous un guid dans le nom de mon fichier :o


Message édité par the real moins moins le 23-11-2004 à 20:44:29
Reply

Marsh Posté le 23-11-2004 à 20:45:06    

darklord a écrit :

Faudra que je vérifie sur la servlet toute conne que j'ai faite le mois passé mais je ne me souviens pas avoir foutu un header quelconque :o

ben faudra que t'essaies avec plusieurs versions d'ie, avec du pdf generé à la volée et ouvert *dans* ie, et tu verras que ça ira pas :o

Reply

Marsh Posté le 23-11-2004 à 20:49:08    

the real moins moins a écrit :

ben faudra que t'essaies avec plusieurs versions d'ie, avec du pdf generé à la volée et ouvert *dans* ie, et tu verras que ça ira pas :o


 
Oui ok, au temps pour moi. Le fichier est effectivement sur disque avant d'etre renvoyé.
 
Il est ouvert dans IE et j'ai essayé avec IE 5, 5.5 et 6

Reply

Marsh Posté le 23-11-2004 à 20:52:33    

euh bah étant sur disque, ça change peut etre rien, mais a priori tu dois qd meme setter le content-length
 
j'ai pas testé, mais steve m'a reporté ce probleme, et on a trouvé la soluce dans la faq d'itext, donc bon

Reply

Marsh Posté le 23-11-2004 à 23:14:31    

the real moins moins a écrit :

fais pas chier, je fous un guid dans le nom de mon fichier :o


C'est quoi un guid ?

Reply

Marsh Posté le 24-11-2004 à 08:43:17    

patachou a écrit :

C'est quoi un guid ?


 
un Gui Delage, ca permet de s'y retrouver au milieu d'un océan de données


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 24-11-2004 à 11:10:24    

Oui d'accord je connaissais pas alors je me renseignais, j'ai regardé un peu sur le net pour savoir un peu plus.
Merci de l'info

Reply

Marsh Posté le 24-11-2004 à 11:15:18    

[:petrus75]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 24-11-2004 à 11:44:52    

Reply

Marsh Posté le 24-11-2004 à 13:27:34    

Merci pour le lien, y a des implémentations en java ?

Reply

Marsh Posté le 24-11-2004 à 18:36:51    

patachou a écrit :

Merci pour le lien, y a des implémentations en java ?


 
oui, Xdoclet a une implémentation (pour les PK d'un EJB si mes souvenirs sont bon)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 25-11-2004 à 22:31:55    

Code :
  1. /**
  2. * <p>A 32 byte GUID generator (Globally Unique ID).
  3. * These artificial keys SHOULD <strong>NOT </strong> be seen by the user,
  4. * not even touched by the DBA but with very rare exceptions,
  5. * just manipulated by the database and the programs.</p>
  6. *
  7. * <p>Usage: pass an object reference to the generate method,
  8. * somehow relative to the object to which you want to generator a guid for.
  9. * This is to ensure more "randomness". (as long as you pass a different
  10. * object for each call it should have a correct behaviour)</p>
  11. *
  12. * <p><strong>This was copied from *Util class generated by XDoclet.</strong></p>
  13. *
  14. */
  15. public class Guid {
  16.     /** Cached per JVM server IP. */
  17.     private static String hexServerIP = null;
  18.     // initialise the secure random instance
  19.     private static final SecureRandom seeder = new SecureRandom();
  20.     /**
  21.      * Generates a GUID.
  22.      *
  23.      * @throws IllegalStateException if it can not get the local ip address of the machine.
  24.      */
  25.     public static final String generate(Object o) throws IllegalStateException {
  26.         StringBuffer tmpBuffer = new StringBuffer(16);
  27.         if (hexServerIP == null) {
  28.             InetAddress localInetAddress = null;
  29.             try {
  30.                 // get the inet address
  31.                 localInetAddress = InetAddress.getLocalHost();
  32.             } catch (UnknownHostException uhe) {
  33.                 throw new IllegalStateException("Guid: Could not get the local IP address using InetAddress.getLocalHost()!" );
  34.             }
  35.             byte serverIP[] = localInetAddress.getAddress();
  36.             hexServerIP = hexFormat(getInt(serverIP), 8);
  37.         }
  38.         String hashcode = hexFormat(System.identityHashCode(o), 8);
  39.         tmpBuffer.append(hexServerIP);
  40.         tmpBuffer.append(hashcode);
  41.         long timeNow = System.currentTimeMillis();
  42.         int timeLow = (int) timeNow & 0xFFFFFFFF;
  43.         int node = seeder.nextInt();
  44.         StringBuffer guid = new StringBuffer(32);
  45.         guid.append(hexFormat(timeLow, 8));
  46.         guid.append(tmpBuffer.toString());
  47.         guid.append(hexFormat(node, 8));
  48.         return guid.toString();
  49.     }
  50.     private static int getInt(byte bytes[]) {
  51.         int i = 0;
  52.         int j = 24;
  53.         for (int k = 0; j >= 0; k++) {
  54.             int l = bytes[k] & 0xff;
  55.             i += l << j;
  56.             j -= 8;
  57.         }
  58.         return i;
  59.     }
  60.     private static String hexFormat(int i, int j) {
  61.         String s = Integer.toHexString(i);
  62.         return padHex(s, j) + s;
  63.     }
  64.     private static String padHex(String s, int i) {
  65.         StringBuffer tmpBuffer = new StringBuffer();
  66.         if (s.length() < i) {
  67.             for (int j = 0; j < i - s.length(); j++) {
  68.                 tmpBuffer.append('0');
  69.             }
  70.         }
  71.         return tmpBuffer.toString();
  72.     }
  73. }


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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