Partage
  • Partager sur Facebook
  • Partager sur Twitter

Codage/Decodage Base64 document Word ou PDF

Sujet résolu
    3 février 2010 à 10:51:33

    Bonjour tout le monde,

    J'ai créé une petite application pour coder et décoder du texte en base64. Elle fonctionne ! :p
    Mais uniquement avec les fichiers .txt :o Dès que je veux coder, puis décoder un fichier de type Word, je me retrouve avec des caractères bizarres et au milieu de tout ça mon texte. En plus de ça, mon fichier word est dit "corrompu" à l'ouverture ! Même chose pour les PDF mais cette fois le fichier n'est pas corrompu puisqu'il est vierge !

    Alors ma question... Est ce que vous savez d'où cela peut provenir ? Auriez vous une piste pour contrer le problème ? Je précise (au cas où ça serait important) que dans mon encodage j'ai écrit texte.getBytes("iso-8859-1").

    Merci d'avance à ceux qui pourront me lire et me répondre ! ;)
    • Partager sur Facebook
    • Partager sur Twitter
      3 février 2010 à 12:09:14

      Dans un fichier word il y a beaucoup de choses... autre que le texte. Donc si tu code directement ton fichier word, tu codes aussi les informations sur la mise en page, de police...
      Après le texte n'est pas en clair, donc ce n'est pas évident. Ca va dépendre du type 97/2000/XP/docx...
      visiblement tu as API POI qui permet de lire des fichiers Microsoft
      • Partager sur Facebook
      • Partager sur Twitter
        3 février 2010 à 15:54:06

        IL ne faut pas lire le fichier word d'origine en mode texte, mais en mode binaire. Il ne faut jamais au grand jamais recourir aux Strings pour la lecture binaire.

        Si tu essaies de convertir en byte[] une String qui contient des séquences invalides dans le jeu de caractères demandé, tu cours effectivement le risque de récupérer n'importe quoi. C'est normal puisque ce n'est pas fait pour ça.
        • Partager sur Facebook
        • Partager sur Twitter
          3 février 2010 à 17:32:47

          Ta remarque est forte intéressante. Comment est ce que je dois procéder donc ? Voici un extrait de mon code qui est concerné (ici le decodage mais le codage fonctionne exactement pareil). Je me plante ? :euh:

          RandomAccessFile br= new RandomAccessFile(fichier,"rw");
          String ligne;
          RandomAccessFile ecrivain= new RandomAccessFile("Coucou2.doc","rw");
          			
          while ((ligne=br.readLine())!=null){
          	ligne = decode(ligne);
          	System.out.println(ligne);
          	ecrivain.writeBytes(ligne);
          }
          br.close();
          ecrivain.close();
          
          • Partager sur Facebook
          • Partager sur Twitter
            3 février 2010 à 18:17:49

            Ça y est j'ai compris :p .
            Donc tout d'abord comme le faisait remarquer QuentinC 2:

            Citation : QuentinC 2

            Il ne faut jamais au grand jamais recourir aux Strings pour la lecture binaire.


            Tu dois donc coder directement des arrays de bytes
            RandomAccessFile ne te permet pas d'après la Javadoc de lire des arrays de bytes. Utilise donc plutôt des FileOutput & InputStream couplé avec des files Channels (cf le tuto de Cysboy)

            Donc d'abord tu dois créer une fonction
            byte[] coder(byte[] array)
            
            qui prend un array de bytes (ici 3 pour la base64) et qui te la code en un autre array de bytes. A l'intérieur, ne convertit jamais ton array d'entrée en String.
            Avec les opérations binaires &, |, <<, >>, c'est faisable.

            Après ça roule...


            Si tu plantes.
            J'ai fais un système de cryptage similaire basé sur AES.
            d'abord tu définis tes variables
            FileInputStream fis = null;
                    FileOutputStream fos = null;
                    FileChannel fcIn = null,fcOut = null;
                    ByteBuffer bufferIn, bufferOut;
            
            fis = new FileInputStream(source);
                        fos = new FileOutputStream(new File(name));
                        fcIn = fis.getChannel();
                        fcOut = fos.getChannel();
            


            puis tu lis un paquet de bits à cryter: (16 en AES)
            size = (int) Math.min(16, fcIn.size()-fcIn.position());
                            bufferIn = ByteBuffer.allocate(size);
                            fcIn.read(bufferIn);
                            bufferIn.flip();
                            array = bufferIn.array();
            

            tu cryptes
            array = aes.crypt(array);
            

            et tu écris dans ton fichier de sortie
            bufferOut = ByteBuffer.allocate(16);
                            bufferOut.put(array);
                            bufferOut.flip();
                            fcOut.write(bufferOut);
            

            voilà les bases, sans les exceptions, etc...
            bon courage!




            • Partager sur Facebook
            • Partager sur Twitter
              3 février 2010 à 21:55:21

              Si ça peut te rendre service, je peux poster mes deux classes Base64InputStream et Base64OutputStream, pour que tu voies comment c'est fait... mais ça risque d'être un peu long, respectivement 61 et 67 lignes.
              • Partager sur Facebook
              • Partager sur Twitter

              Codage/Decodage Base64 document Word ou PDF

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown