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

Format d'échange (XML, JSON...) Java Discussion :

Problème "Invalid byte 2 of 3-byte UTF-8 sequence" [XStream]


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 298
    Points : 85
    Points
    85
    Par défaut Problème "Invalid byte 2 of 3-byte UTF-8 sequence"
    Bonjour,
    je fais la conversion de xml en pdf avec fop du coup :
    1- je génère un fichier xml
    2- j'ai un fichier xsl de transformation
    mais dès que mon fichier xml contient des données avec des caractères comme
    "Services d'échanges de données fixes" la transformation xsl échoue avec l'exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SEVERE: javax.xml.transform.TransformerException: java.io.UTFDataFormatException: Invalid byte 2 of 3-byte UTF-8 sequence.
    je veux savoir si le problème vient de :
    1- mon code java de transformation
    2- ou mon fichier xsl

    le code java est comme suivant:
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    	public static boolean generatePDF(HttpServletResponse response, Object dataToSerialize, XStream xstream, String xslFilePath,String xmlFilePath) {
     
    		logger.info("begin generatePDF");
     
    		//TODO delete later :DEBUG : affiche dans System.out le résultat de la sérialisation
    		xstream.toXML(dataToSerialize, System.out);
    		boolean success = true;
     
    		try {
     
    			File xmlfile = new File(xmlFilePath);
     
    			//File xsltfile = new File(xslFilePath);
    			FileOutputStream fos = new FileOutputStream(xmlfile);
     
    			// DEBUG : affiche dans System.out le résultat de la sérialisation
    			xstream.toXML(dataToSerialize,fos);
     
    			logger.info("DEBUG 1111111111111");
     
     
     
    			logger.info("DEBUG 22222222222222");		
    			// read xsl file into xslInputStream
    			File xslFile = new File(xslFilePath);
     
    			InputStream xslInputStream = new FileInputStream(xslFile);
    			//TODO to test to reslove caractères problem
    			//InputStream xslInputStream = new ByteArrayInputStream(xslFile.toString().getBytes("UTF-8"));
     
    			// create output stream
    			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
     
     
    			logger.info("DEBUG 444444444444");
     
    			// create pdf driver
    			Driver driver = new Driver();
    			driver.setLogger(new ConsoleLogger(ConsoleLogger.LEVEL_INFO));
    			driver.setRenderer(Driver.RENDER_PDF);
    			driver.setOutputStream(outputStream);
     
    			logger.info("DEBUG 5555555555555");
     
    			// encapsulate objects...
    			//Source xml = new StreamSource(xmlInputStream);
    			Source xsl = new StreamSource(xslInputStream);
    		//	Result res = new SAXResult(driver.getContentHandler());
     
    //			 Setup input for XSLT transformation
    			Source src = new StreamSource(xmlfile);
     
    			// Resulting SAX events (the generated FO) must be piped through to
    			// FOP
    			Result res = new SAXResult(driver.getContentHandler());
    			try {
    				logger.info("DEBUG 6666666666666");
    				// transform xml with xsl
    				Transformer transformer = TransformerFactory.newInstance().newTransformer(xsl);
    				transformer.setParameter("versionParam", "2.0");
     
    				// Start XSLT transformation and FOP processing
    				transformer.transform(src, res);
    				logger.info("DEBUG 6.1");
    				// set response with transformed data
    				response.setContentType("application/pdf");
    				response.setHeader("Content-Disposition", "attachment; filename=contrats.pdf");
     
    				logger.info("DEBUG 6.2");
     
    				response.setContentLength(outputStream.size());
    				response.getOutputStream().write(outputStream.toByteArray());
     
    				logger.info("DEBUG 6.3");
     
    				response.getOutputStream().flush();
    				response.getOutputStream().close();
    			}
    			finally {
    				logger.info("DEBUG 77777777777");
    				//xmlInputStream.close();
    				xslInputStream.close();
    				outputStream.close();
    			}
     
    		}
    		catch (Exception e) {
    			success = false;
    			logger.severe(e.toString());
    		}
     
    		logger.info("end generatePDF");
    		return success;
    	}
    le fichier xsl est déclaré au début comme suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fox="http://xml.apache.org/fop/extensions" xmlns:xi="http://www.w3.org/2001/Xinclude">
    	<xsl:output method="xml" encoding="UTF-8" indent="yes"></xsl:output>
    et utilisant fop pour la transformation mon fichier xsl contient des balises de ce genre:
    <fo:block text-align="left" border="1px solid black" margin-left="1cm" margin-right="1cm">
    <xsl:apply-templates select="contractsImpression/contracts"/>
    </fo:block>

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu ne précises pas l'encodage lors de la lecture/écriture du fichier, ce qui fait que tu utilises l'encodage par défaut du système, et que ce dernier ne doit pas être de l'UTF8...

    En gros sur tes méthodes d'accès aux fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FileOutputStream fos = new FileOutputStream(xmlfile);
     
    InputStream xslInputStream = new FileInputStream(xslFile);
    Tu dois préciser un encodage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Charset utf8 = Charset.forName("utf8")
    Writer fw = new OutputStreamWriter(new FileOutputStream(xmlfile), utf8);
     
    Reader xslReader = new InputStreamReader(new FileInputStream(xslFile), utf8);

    Attention également à bien utiliser un blog try/finally par ressource, et à ouvrir le try juste après l'ouverture de la ressource.
    Dans ton cas sous certaines conditions tu peux sortir de la méthode sans fermer tous les flux, ce qui peut se révéler très problématique dans un environnement serveur

    a++

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 298
    Points : 85
    Points
    85
    Par défaut Exception : SEVERE: javax.xml.transform.TransformerException: Premature end of file.
    Re!
    je pense que ça passe cette fois mais j'ai l'erreur:
    SEVERE: javax.xml.transform.TransformerException: Premature end of file.

    je pense que mon code est un oeu mal fait!!
    comme ci-dessous je vois pas comment utiliser le Writer pour adapter mon code existant:
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    public static boolean generatePDF(HttpServletResponse response, Object dataToSerialize, XStream xstream, String xslFilePath,String xmlFilePath) {
     
    		logger.info("begin generatePDF");
     
    		//TODO delete later :DEBUG : affiche dans System.out le résultat de la sérialisation
    		xstream.toXML(dataToSerialize, System.out);
    		boolean success = true;
     
    		try {
     
    			File xmlfile = new File(xmlFilePath);
    			//File xsltfile = new File(xslFilePath);
    			FileOutputStream fos = new FileOutputStream(xmlfile);
    			// DEBUG : affiche dans System.out le résultat de la sérialisation
    			xstream.toXML(dataToSerialize,fos);
     
    			logger.info("DEBUG 1111111111111");
     
     
     
    			logger.info("DEBUG 22222222222222");		
    //			 read xsl file into xslInputStream
    			File xslFile = new File(xslFilePath);
    			//InputStream xslInputStream = new FileInputStream(xslFile);
    			//
    			Charset utf8 = Charset.forName("utf8");
     
    			Writer fw = new OutputStreamWriter(new FileOutputStream(xmlfile), utf8);
    			Reader xslInputStream = new InputStreamReader(new FileInputStream(xslFile), utf8);
     
    			// create output stream
    			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
     
     
    			logger.info("DEBUG 444444444444");
     
    			// create pdf driver
    			Driver driver = new Driver();
    			driver.setLogger(new ConsoleLogger(ConsoleLogger.LEVEL_INFO));
    			driver.setRenderer(Driver.RENDER_PDF);
    			driver.setOutputStream(outputStream);
     
    			logger.info("DEBUG 5555555555555");
     
    			// encapsulate objects...
    			//Source xml = new StreamSource(xmlInputStream);
    			Source xsl = new StreamSource(xslInputStream);
    		//	Result res = new SAXResult(driver.getContentHandler());
     
    //			 Setup input for XSLT transformation
    			Source src = new StreamSource(xmlfile);
     
    			// Resulting SAX events (the generated FO) must be piped through to
    			// FOP
    			Result res = new SAXResult(driver.getContentHandler());
    			try {
    				logger.info("DEBUG 6666666666666");
    				// transform xml with xsl
    				Transformer transformer = TransformerFactory.newInstance().newTransformer(xsl);
    				transformer.setParameter("versionParam", "2.0");
     
    				// Start XSLT transformation and FOP processing
    				transformer.transform(src, res);
    				logger.info("DEBUG 6.1");
    				// set response with transformed data
    				response.setContentType("application/pdf");
    				response.setHeader("Content-Disposition", "attachment; filename=contrats.pdf");
     
    				logger.info("DEBUG 6.2");
     
    				response.setContentLength(outputStream.size());
    				response.getOutputStream().write(outputStream.toByteArray());
     
    				logger.info("DEBUG 6.3");
     
    				response.getOutputStream().flush();
    				response.getOutputStream().close();
    			}
    			finally {
    				logger.info("DEBUG 77777777777");
    				//xmlInputStream.close();
    				xslInputStream.close();
    				outputStream.close();
    			}
     
    		}
    		catch (Exception e) {
    			success = false;
    			logger.severe(e.toString());
    		}
     
    		logger.info("end generatePDF");
    		return success;
    	}
    Merci

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 298
    Points : 85
    Points
    85
    Par défaut Solution au moment de la sérialisation objet en XML
    la solution est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XStream xstream = new XStream(new DomDriver("UTF-8"));

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/10/2008, 10h32
  2. [DOM] Invalid byte 2 of 3-byte UTF-8 sequence.
    Par aroua dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 14/05/2008, 15h20
  3. [XSLT] [Xsl/Fop] Invalid byte 3 of 3-byte UTF-8 sequence
    Par Eylir dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 27/12/2007, 11h49
  4. Invalid byte 2 of 3-byte UTF-8 sequence
    Par Finrod dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 06/06/2007, 10h55
  5. [XHTML] Problème de Unicode Byte-Order Mark (BOM) in UTF-8 (?)
    Par gb-ch dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 13/02/2007, 02h01

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