IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Problème encodage PDF de flux à flux


Sujet :

Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Problème encodage PDF de flux à flux
    Bonjour,

    Je travaille actuellement sur l'édition de facture sur une appli web.

    Le clic sur le lien de la facture déclenche l'appel d'un ejb qui va récupérer la facture sur un autre serveur.

    Le but est donc de transmettre à l'EJB le flux de sortie de l'utilisateur pour qu'il écrive dedans à partir du flux d'entrée du serveur des factures.

    Tout cela fonctionne bien sauf que j'ai un problème d'encodage ce qui fait que le document pdf est corrompu.

    Lorsque sur mon ejb je sauvegarde la facture dans un fichier à partir du flux de serveur factures, puis que je transfère ce fichier dans le flux client, tout se passe bien.

    C'est donc bien le fait d'écrire directement dans le flux de sortie client à partir du flux d'entrée qui pose le problème.

    Les factures téléchargées ont des tailles variant de quelques octées. Lors de leur édition, soit elles s'affichent bien, soit elles s'affichent mal, soit elles ne s'affichent pas du tout.

    Pour transmettre le flux de sortie au serveur ejb, j'utilise la librairie com.healthmarketscience.rmiio.

    Passons au code :

    Coté client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    			HttpServletResponse lOuterResponse;
    			OutputStream os = null;
    			RemoteOutputStreamServer ostream = null;
     
    			System.setProperty(RemoteStreamExporter.EXPORTER_PROPERTY, WeblogicRemoteStreamExporter.class.getName());
     
    			// Parametrage du flux de retour
    			lOuterResponse = getResponse();
    			lOuterResponse.setHeader("Expires", "0");
    			lOuterResponse.setHeader("Cache-Control", "no-cache, no-store");
    			lOuterResponse.setHeader("Pragma", "public");
    			lOuterResponse.setHeader("Content-Type", "application/pdf");
    			lOuterResponse.setHeader("Content-Disposition", "inline; filename=\"facture" + vNumDocConso + ".pdf\"");
     
     
    			os = lOuterResponse.getOutputStream();
     
    			ostream = new SimpleRemoteOutputStream(new BufferedOutputStream(os));
     
    			InputDto vInputDto = new InputDto();
    			vInputDto.setUrlFacture(urlPdf);
    			vInputDto.setOutputStream(ostream.export());
     
    			FacturePDFManager.sendFacturePdf(vInputDto);
    Coté serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    BufferedInputStream bufferedInput = null;
    			int vReadTimeout = 0;
     
    			final String vUrlPDF = pInputDto.getUrlFacture();
    			final URL vURL = new URL(vUrlPDF);
    			final URLConnection vURLConnection = vURL.openConnection();
     
    			// on caste car on sait que c'est une HTTPUrlConnection
    			final HttpURLConnection vHttpURLConnection = (HttpURLConnection) vURLConnection;
     
    			//Recuperation du timeout de lecture
    			vReadTimeout = new Integer(EjbPropertiesManager.getInstance().getProperty("ReadTimeout"));
     
    			vHttpURLConnection.setReadTimeout(vReadTimeout);
     
    			RemoteOutputStream lOutputStream = pInputDocubaseDto.getOutputStream();
     
    			byte[] buffer = new byte[1024];
     
    			bufferedInput = new BufferedInputStream(vHttpURLConnection.getInputStream());
     
    			int i=0;
     
    			//Keep reading from the file while there is any content
    			//when the end of the stream has been reached, -1 is returned
    			while (bufferedInput.read(buffer) != -1) {
    				lOutputStream.writePacket(buffer, i++);
    				lOutputStream.flush();
    			}
     
    			if (bufferedInput != null) {
    				bufferedInput.close();
    			}
    Voilà.

    Quelqu'un a t'il une solution à me proposer ? Des pistes à explorer ?

    S'il vous plait, merci de ne répondre uniquement à la question posée.

    Florian.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Côté serveur :

    Attention, InputStream.read(byte[]) ne va pas forcément remplir tout le buffer. En fait, il est assez évident qu'à la fin, il ne va pas le remplir entièrement.

    Cet appel lit au moins un octet, et au plus la taille du buffer. Mais on ne sait pas à l'avance combien, entre ces deux-là. L'appel renvoie un int, qui :
    - est négatif s'il n'a rien lu parce qu'on est à la fin du flux.
    - indique le nombre d'octets lus et mis dans le buffer, sinon.

    Quand tu appelles ensuite writePacket() pour transmettre ce que tu as lu, rappelle-toi de ne transmettre que ce que tu as lu, que le début du buffer, et pas les octets du buffer qui sont restés inchangés.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Côté serveur :

    Attention, InputStream.read(byte[]) ne va pas forcément remplir tout le buffer. En fait, il est assez évident qu'à la fin, il ne va pas le remplir entièrement.

    Cet appel lit au moins un octet, et au plus la taille du buffer. Mais on ne sait pas à l'avance combien, entre ces deux-là. L'appel renvoie un int, qui :
    - est négatif s'il n'a rien lu parce qu'on est à la fin du flux.
    - indique le nombre d'octets lus et mis dans le buffer, sinon.

    Quand tu appelles ensuite writePacket() pour transmettre ce que tu as lu, rappelle-toi de ne transmettre que ce que tu as lu, que le début du buffer, et pas les octets du buffer qui sont restés inchangés.
    Bravo,

    J'ai mis mon buffer a 1 byte pour tester et ca fonctionne.
    Bravo et merci beaucoup.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par florian.terisse Voir le message
    J'ai mis mon buffer a 1 byte pour tester et ca fonctionne.
    Bravo et merci beaucoup.
    J'ose espérer que c'est vraiment "juste pour tester"
    Sinon n'oublie pas le bouton résolu

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    J'ose espérer que c'est vraiment "juste pour tester"
    Sinon n'oublie pas le bouton résolu

    Oui bien sur :-)
    Merci pour ton aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème encodage flux xml (CDATA) dans String
    Par Hurricae dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 01/08/2011, 07h50
  2. problème de lecture d'un flux wmv
    Par zangaliw dans le forum Android
    Réponses: 3
    Dernier message: 12/08/2010, 00h06
  3. Problème de lecture d'un flux vidéo
    Par valentin45 dans le forum OpenCV
    Réponses: 1
    Dernier message: 11/12/2009, 16h55
  4. Problème pour la lecture de Flux RSS
    Par cissou06 dans le forum Ruby
    Réponses: 6
    Dernier message: 30/11/2007, 18h18
  5. problème balise html dans un flux rss
    Par irons dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 22/05/2006, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo