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

C++ Discussion :

Génération PDF à partir d'un Blob Oracle


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Par défaut Génération PDF à partir d'un Blob Oracle
    Bonjour,

    J'ai stocké le contenu d'un fichier PDF dans un Blob.
    Je souhaiterai regénérer un fichier PDF à partir de celui-ci dans mon programme.
    Le contenu du Blob ressemble à ça :

    %PDF-1.3
    %âãÏÓ

    1 0 obj
    <<
    /Type /Catalog
    /Outlines 2 0 R
    /Pages 3 0 R
    >>
    endobj

    ...

    xref
    0 10
    0000000000 65535 f
    0000000019 00000 n
    0000000093 00000 n
    0000000147 00000 n
    0000000216 00000 n
    0000000386 00000 n
    0000016695 00000 n
    0000016728 00000 n
    0000016851 00000 n
    0000016969 00000 n

    trailer
    <<
    /Size 10
    /Root 1 0 R
    /Info 9 0 R
    >>

    startxref
    17116
    %%EOF
    Pouvez-vous m'aider ?

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ou est ton probleme ? Une fois que tu as fait ta requete SQL, tu ecris dans un fichier.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Par défaut
    L'écriture dans le fichier ne fonctionne pas sur tous les fichiers PDF, uniquement ceux générés à partir d'un état Rave.
    J'utilise ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    fiche       = Blob->AsString;
    nom_fichier = "Contrat.pdf";
    path = RepertoireTemporaireWindows();
    fichier_complet = path + nom_fichier;
     
    ofstream fichier(fichier_complet.c_str());
    if (fichier.is_open())
       {
       fichier << fiche.c_str();
       fichier.close();
       }
     
    ShellExecute(Handle,"open",PChar(fichier_complet.c_str()),NULL,NULL,SW_SHOW);

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ecrire dans un ifstream ne marche pas ??

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Ecrire dans un ifstream ne marche pas ??
    Il me semble que l'écriture dans un ifstream ne marche pas, c'est uniquement pour la lecture de fichier.

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par drake56 Voir le message
    Il me semble que l'écriture dans un ifstream ne marche pas, c'est uniquement pour la lecture de fichier.
    Pardon, ofstream. Je ne comprends pas pourquoi cette donnee qui provient d'un pdf lu brutalement ne peut pas etre enregistre brutalement de la meme maniere. Il ya un truc qui m'echappe dans la maniere dont le resultat de la requete a ete cree par rapport au pdf original.
    Normalement un stream.write(blob.c_str(), blob.size()) devrait etre suffisant.

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Pardon, ofstream. Je ne comprends pas pourquoi cette donnee qui provient d'un pdf lu brutalement ne peut pas etre enregistre brutalement de la meme maniere. Il ya un truc qui m'echappe dans la maniere dont le resultat de la requete a ete cree par rapport au pdf original.
    Normalement un stream.write(blob.c_str(), blob.size()) devrait etre suffisant.
    Moi non + je comprends pas, j'ai essayé le write comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ofstream fichier(fichier_complet.c_str());
    if (fichier.is_open())
       {
       fichier.write(contenu.c_str(),strlen(contenu.c_str()));
       fichier.close();
       }
     
    ShellExecute(Handle,"open",PChar(fichier_complet.c_str()),NULL,NULL,SW_SHOW);
    Mon PDF généré à partir d'un Rave il sort nickel mon autre pdf issu d'un scan rien n'a faire, fichier endommagé.

    Merci d'avoir prit le temps de me répondre

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    strlen... Pourquoi tu passes par un strlen alors que le contenu est binaire et donc peut contenir des \0 ? strlen ne te retourne pas la bonne taille ! verifie ailleurs, mais je suis certain que ton fichier est tronque parce que tu n'as pas utilise la methode size() !

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    AS-tu essayé d'ouvrir le fichier en mode binaire ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    strlen... Pourquoi tu passes par un strlen alors que le contenu est binaire et donc peut contenir des \0 ? strlen ne te retourne pas la bonne taille ! verifie ailleurs, mais je suis certain que ton fichier est tronque parce que tu n'as pas utilise la methode size() !
    La méthode size() ne marche pas avec un String en fait, j'ai cherché un équivalent.
    Je vais essayé en mode binaire mais faut que je fasse mon fichier en .bin ?
    Merci

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tu es déjà en binaire.
    Tant que tu ne fourniras pas la bonne taille (strlen, ça marche pour du texte, pas pour du binaire), tu te prendras un mur.
    Maintenant, c'est sûr que si notre supposition que ton texte est dans une std::string n'est pas correcte, on ne peut pas trop t'aider à utiliser la bonne méthode. Mais ton erreur est clairement là. Faut pas chercher plus loin.

  12. #12
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Tu es déjà en binaire.
    Tant que tu ne fourniras pas la bonne taille (strlen, ça marche pour du texte, pas pour du binaire), tu te prendras un mur.
    Maintenant, c'est sûr que si notre supposition que ton texte est dans une std::string n'est pas correcte, on ne peut pas trop t'aider à utiliser la bonne méthode. Mais ton erreur est clairement là. Faut pas chercher plus loin.
    J'ai utilisé exactement ce que tu as dis et toujours le même souci, il ne prend que le PDF issu d'un état Rave. J'ai fait ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ofstream fichier(fichier_complet.c_str());
    if (fichier.is_open())
       {
       string str(contenu.c_str());
       fichier.write(str.c_str(),str.size());
       fichier.close();
       }
    fichier complet = chemin où sera créé le fichier
    contenu = le contenu de mon Blob AsString

    Je comprends vraiment pas d'où ça peut venir

  13. #13
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Parce que tu ne vérifies pas les tailles !
    Tu crées un string, bien, mais sa taille est calculée par un strlen derrière ! (i.e. ton erreur est ligne 4, tu ne peux pas construire une std::string avec tout le contenu de ta chaîne d'origine ainsi. Tu peux potentiellement le faire avec des itérateurs, mais comme tu ne nous dis pas le type de ton objet au départ, on en peut rien faire de plus pour t'aider)
    Tu es OBLIGE de specifier la taille quand tu passes un c_str, sinon il s'arrête au premier \0 rencontré.

    Je ne sais pas combien de fois je vais être obligé de me répéter. En fait, c'est la dernière.

  14. #14
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Parce que tu ne vérifies pas les tailles !
    Tu crées un string, bien, mais sa taille est calculée par un strlen derrière ! (i.e. ton erreur est ligne 4, tu ne peux pas construire une std::string avec tout le contenu de ta chaîne d'origine ainsi. Tu peux potentiellement le faire avec des itérateurs, mais comme tu ne nous dis pas le type de ton objet au départ, on en peut rien faire de plus pour t'aider)
    Tu es OBLIGE de specifier la taille quand tu passes un c_str, sinon il s'arrête au premier \0 rencontré.

    Je ne sais pas combien de fois je vais être obligé de me répéter. En fait, c'est la dernière.
    J'avais compris qu'il fallait que je mette mon champs AnsiString dans un champ string et qu'à partir de celui ci j'utilise la méthode write avec le string.c_str() et je calcule la taille au même moment avec string.size(). Je vais essayer comme tu me l'as précisé là merci

  15. #15
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Sauf que tu passes par des char* et que tu calcules tes tailles là dessus alors que ce n'est pas bon (les char* sont toujours terminés par le premier \0 rencontré, ce qui n'est pas le cas des strings, donc tu dois faire différemment).
    Si ton AnsiString a directement un pointeur voir* ou autre à l'intérieur et que tu as la taille du buffer interne, ça marche aussi, mais tu dois rester cohérent en gardant toujours l'objet et sa taille de départ sans la faire recalculer.
    Et surtout vérifie à la fin que ton pdf a la bonne taille, c'est ton premier indicateur que la contrainte que je viens de donner n'a pas été respectée.

  16. #16
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Sauf que tu passes par des char* et que tu calcules tes tailles là dessus alors que ce n'est pas bon (les char* sont toujours terminés par le premier \0 rencontré, ce qui n'est pas le cas des strings, donc tu dois faire différemment).
    Si ton AnsiString a directement un pointeur voir* ou autre à l'intérieur et que tu as la taille du buffer interne, ça marche aussi, mais tu dois rester cohérent en gardant toujours l'objet et sa taille de départ sans la faire recalculer.
    Et surtout vérifie à la fin que ton pdf a la bonne taille, c'est ton premier indicateur que la contrainte que je viens de donner n'a pas été respectée.
    Bon ça ne marche hélas toujours pas mais le message d'erreur à l'ouverture du PDF a évolué (Données insuffisantes pour afficher une image).
    J'ai fait ça en espérant que je n'ai rien oublié (probablement que si mais bon) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ofstream fichier(fichier_complet.c_str());
    if (fichier.is_open())
       {
       string str(contenu.c_str(), contenu.Length()); 
       fichier.write(str.c_str(), contenu.Length());
       fichier.close();
       }
    Mon fichier fait bien la taille de l'original puisque j'ai bien gardé la taille de mon AnsiString.
    Il faut que je trouve un moyen de l'écrire sans char* de manière à ce que l'écriture ne s'arrête pas au premier \0 ?

    Merci encore pour ton aide et désolé pour le dérangement, j'ai jamais manipulé donc c'est un peu galère..

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Pour quoi passer par un string maintenant ? Fourni directement ta chaine à l'écrivain.

  18. #18
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Pour quoi passer par un string maintenant ? Fourni directement ta chaine à l'écrivain.
    J'avais essayé sans passer par le string puisque j'en voyais plus l'intérêt aussi mais j'arrive au même résultat ("Données insuffisantes pour afficher une image").
    Il faut utiliser autre chose que Length ?

  19. #19
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    A priori, un pdf est un fichier binaire.

    Son contenu peut donc, a priori, etre composé virtuellement de l'ensemble des caractères ASCII, y compris ceux auxquels std::string donne une signification particulière (en gros: n'importe quel caractère dont l'indice est compris dans l'espace [0,32[ ).

    Tu ne peux donc pas récupérer le contenu du fichier dans une std::string, qui permet de représenter les chaines de caractères, parce que qu'elle va de manière indue (par rapport au contexte d'un fichier binaire) au niveau du premier '\0' qu'elle rencontrera lorsqu'elle sera évaluée (entre autres, lorsque tu voudra en connaitre la taille).

    Ce que tu dois utiliser pour représenter le contenu de ton fichier, c'est un vecteur de caractères non signé (std::vector<unsigned char> ) pour être sur que l'intégralité du contenu de ton BLOB sera bel et bien pris en compte.

    A partir de là, tu n'auras plus de problème pour effectuer l'écriture de ton fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(){
        std::vector<unsigned char > content;
        /* je passe la récupération du contenu du blob */
       {
            std::ofstream ofs("fichier.pdf", std::ios_base::binary);
            ofs.write(&content[0],content.size());
        }
        ShellExecute(Handle, "open", PChar("fichier.pdf"), NULL,NULL, SW_SHOW);
    }
    (il n'y a plus qu'à rajouter les point de variation au niveau de nom de fichier )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  20. #20
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Par défaut
    Bonjour,

    Merci pour ta réponse, par contre, je fais comment pour insérer le contenu de mon AnsiString (le blob) dans le vecteur de caractères non signés ?

    Edit : Sans passer par le vecteur et en ajoutant ça a suffit à résoudre mon soucis.
    Merci beaucoup
    Je fais donc ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ofstream fichier(fichier_complet.c_str(), ios_base::binary);
    if (fichier.is_open())
       {
       fichier.write(contenu.c_str(), contenu.Length());
       fichier.close();
       }

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [PDF] Génération PDF à partir d'un PDF existant
    Par firemax dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 27/09/2008, 21h07
  2. Réponses: 1
    Dernier message: 26/03/2008, 17h57
  3. Génération PDF à partir d'une page JSP
    Par fatenatwork dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/12/2007, 21h15
  4. [JDBC]ouvrir un fichier pdf à partir d'un blob
    Par souletis dans le forum JDBC
    Réponses: 5
    Dernier message: 25/01/2007, 21h03
  5. [PDF] génération de pdf à partir de . . . rien?
    Par bakonu dans le forum Documents
    Réponses: 4
    Dernier message: 19/06/2006, 13h09

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