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

 Delphi Discussion :

Manipulation d'un PDF sous delphi


Sujet :

Delphi

  1. #1
    Membre du Club Avatar de Chakalaka
    Inscrit en
    Octobre 2007
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 152
    Points : 66
    Points
    66
    Par défaut Manipulation d'un PDF sous delphi
    Bonjour à tous,

    Je voudrais savoir comment visualiser (ouvrir) un pdf depuis un path que j'ai deja. Ce pdf devrait être sauvegarder dans un champ blob dans ma BD

    Avez vous une piste pour faire ça ?
    PS: Pas forcément le code deja prêt les mots clé des objets à utiliser seraient un bon début pour moi

    Merci

  2. #2
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Une idée, mais sous toutes réserves :
    Utiliser une tstringlist pour 'lire' le fichier et stocker le .text dans ton Blob.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var tsTemp : tstringlist;
         sBlob : string;
    begin
      tsTemp := tstringlist.create;
      tsTemp.loadFromFile('toto.pdf');
      sBlob := tsTemp.text;
    //// ici tu stockes to Blob
      tsTemp.free;
    end;

  3. #3
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut


    inspires-toi de cette FAQ

    l'idée est d'enregistrer ton fichier dans un champ blob, et pour visualiser celui ci, l'extraire dans un chemin temporaire et l'afficher.

    des pistes:
    TBlobField.LoadFromFile
    TBlobField.SaveToFile
    Shellexecute
    ...

  4. #4
    Membre du Club Avatar de Chakalaka
    Inscrit en
    Octobre 2007
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 152
    Points : 66
    Points
    66
    Par défaut
    Merci pour vos réponses

    En ce qui concerne l'ouverture d'un fichier PDF voici le code pour le faire
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    { Tentative d'ouverture de l'application associée }
       errCode := ShellExecute( 0, PChar('open'),  PChar(DocPath), nil, nil,
                                SW_SHOWDEFAULT );
       { Si la tentative a échoué avec le code SE_ERR_NOASSOC, c'est que l'extension
        n'est associée à aucune application }
        if errCode = SE_ERR_NOASSOC then
        { Dans ce cas, on appelle le dialogue }
        errCode:= ShellExecute(0, 'open', 'rundll32.exe', PChar('shell32.dll,OpenAs_RunDLL ' + DocPath),
                               PChar(sDocPath), SW_SHOWNORMAL);
       { Si le code retourné par ShellExecute est supérieur à 32, alors l'opération
        a réussi, sinon c'est un code d'erreur }
          result:= errCode > 32;

  5. #5
    Membre du Club Avatar de Chakalaka
    Inscrit en
    Octobre 2007
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 152
    Points : 66
    Points
    66
    Par défaut
    En ce qui concene la sauvegarde de ce pdf dans un champ Blob de ma BD

    Code delphi : 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
     
    procedure Tfrm.SaveDocument;
    Var
      Blob  : TExpertBlobStream;
      MsgNo: String;
      Tempstrm : TMemoryStream;
    Begin
       Qry := nil;
       if DocPath = '' then
       begin
          raise exception.create('Document not found:' + ' ' + DocPath);
          exit;
       end;
       try
         // Creation de la Query
         if MsgNo <> '' then
          Begin
            // Traitement d'erreur;
          end;
          // Requete pour avoir mon champ blob en context
          Qry.Open
          if Qry.Eof then
            Qry.Append
          else
            Qry.Edit;
            Blob := TExpertBlobStream.Create(TBlobField(Qry.FieldByName('CONTENT')),
                                                bmWrite);
            // Se placer au début du blob
            Blob.Seek(0, soFromBeginning);
            tempStrm := TMemoryStream.Create;
            TBlobField(Qry.FieldByName('CONTENT')).Transliterate:=False;
            TBlobField(Qry.FieldByName('CONTENT')).SaveToStream(Blob);
            TBlobField(Qry.FieldByName('CONTENT')).SaveToStream(tempStrm);
     
       finally
         if Qry <> nil then
          Begin
            Qry.Cancel;
            Qry.Close;
            Qry.Free;
            tempStrm.free;
            Blob.free;
          end;
       end;
    end;

    ça semble correct mais j'ai une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Dataset not in edit or insert mode
    Pourtant j'ai bel et bien un Qry.Edit avant
    J'ai essayé d'inseré des posts après le save sans résultat
    Est ce que je passe les bons paramètres ? Ai-je oublié quelque chose ?

    Merci d'avance

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Il y a quoi dans ta Query comme SQL ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Membre du Club Avatar de Chakalaka
    Inscrit en
    Octobre 2007
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 152
    Points : 66
    Points
    66
    Par défaut
    C'est un select sur mon champ Blob (Content)

  8. #8
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Chakalaka Voir le message
    C'est un select sur mon champ Blob (Content)
    Pourquoi, tu n'as pas mis de Qry.post !!

    Et pourquoi tu balance un
    Qry.cancel
    Qry.Close
    Qry.free
    d'un coup sec !!

    Surtout le qry.cancel qui annulera ton opération edit ou append !!

  9. #9
    Membre du Club Avatar de Chakalaka
    Inscrit en
    Octobre 2007
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 152
    Points : 66
    Points
    66
    Par défaut
    Thnx guys
    BuzzLeclaire tu as raison faut faire un post
    J'ai cherché sur le net j'ai trouvé de quoi qui a fonctionné pour moi sans avoir à passer par un TMemoryStream intermédiaire (même pas compris pourquoi ils le font )

    Code delphi : 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
     
    procedure Tfrm.SaveDocument;
    var 
        MsgNo: String;
        FileStream: TFileStream;
        BlobStream: TExpertBlobStream;
        lstAllFields: TStringList;
    Begin
       Qry := nil;
       lstAllFields := TStringList.Create;
       lstAllFields := nil;
        if DocPath = '' then
       begin
          //Traitement d'erreur
       end;
       try
         // CReation de la query
         if MsgNo <> '' then
          Begin
            //Traitement
          end;
          Qry.SQL.Clear;
          // Requete select * sur la table contenant le blob
          Qry.Open;
     
          if Qry.Eof then
            Qry.Append
          else
            Qry.Edit;
            FileStream:=TFileStream.Create(DocPath,fmOpenRead+fmShareDenyWrite);
            TBlobField(Qry.FieldByName('CONTENT')).Transliterate:=False;
            BlobStream:=TExpertBlobStream.Create(TBlobField(Qry.FieldByName('CONTENT')),bmWrite);
            BlobStream.LoadFromFile(DocPath);
            BlobStream.Free;
            FileStream.Free;
            Qry.Post;
       finally
         if Qry <> nil then
          Begin
            Qry.Cancel;
            Qry.Close;
            Qry.Free;
           end;
       end;
    end;

  10. #10
    Membre du Club Avatar de Chakalaka
    Inscrit en
    Octobre 2007
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 152
    Points : 66
    Points
    66
    Par défaut
    Donnez moi un moment pour essayer de extraire ce que j'ai sauvegardé dans ce blob afin de l'afficher avant de faire "Resolu"

  11. #11
    Membre du Club Avatar de Chakalaka
    Inscrit en
    Octobre 2007
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 152
    Points : 66
    Points
    66
    Par défaut
    Pour faire l'opération inverse qui est ouvrir un PDF depuis un champ blob faudrait-il loader ce fichier dans un stream temporaire ou bien ya moyen de l'ouvrir directement avec un Shellexecute ?
    Je pose cette question puisqu'il me semble qu'il faut specifié un path pour le Shellexecute et pas un champs blob d'une bd

    thnx again

  12. #12
    Membre du Club Avatar de Chakalaka
    Inscrit en
    Octobre 2007
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 152
    Points : 66
    Points
    66
    Par défaut
    Bon ça avance ça avance mais il me faut un coup de main pour résoudre mon problème

    Voici le code qui créer un pdf dans le dossier temp de Windows depuis un champs Blob

    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Après ma requete SQL sur le champ blob
    DocName := ExtractFileName(Qry.FieldByName('SOURCE').AsString);
    DocPath := GetEnvironmentVariable('TEMP')+ '\' + DocName;
    FileStream:=TFileStream.Create(DocPath, fmCreate);
    TBlobField(Qry.FieldByName('CONTENT')).Transliterate:=False;
    BlobStream:=TExpertBlobStream.Create(TBlobField(Qry.FieldByName('CONTENT')),bmRead);
     BlobStream.SaveToStream(FileStream);
     BlobStream.Free;
    errCode := ShellExecute( 0, PChar('open'),  PChar(DocPath), nil, nil,
                                    SW_SHOWDEFAULT );        
    FileStream.Free;

    tous semble beau mais j'ai un code 42 retourné par le shellExecute mon fichier a bel et bien été créer dans le Temp avec le bon size
    Sur le net je trouve que seul les code plus petit que 32 indiquent une erreur

  13. #13
    Membre du Club Avatar de Chakalaka
    Inscrit en
    Octobre 2007
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 152
    Points : 66
    Points
    66
    Par défaut
    voici l'erreur que j'ai au lancement de Adobe

  14. #14
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    FileStream.Free; // a mettre avant sinon le fichier est toujours ouvert
     
    errCode := ShellExecute( 0, PChar('open'),  PChar(DocPath), nil, nil,
                                    SW_SHOWDEFAULT );
    Si tu ne libères pas le fichier avant de le faire lire par adobe ...
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  15. #15
    Membre du Club Avatar de Chakalaka
    Inscrit en
    Octobre 2007
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 152
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    FileStream.Free; // a mettre avant sinon le fichier est toujours ouvert
     
    errCode := ShellExecute( 0, PChar('open'),  PChar(DocPath), nil, nil,
                                    SW_SHOWDEFAULT );
    Si tu ne libères pas le fichier avant de le faire lire par adobe ...

    à l'infinie

  16. #16
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    merci pour touts ces explication

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

Discussions similaires

  1. Gestion d'un fichier PDF sous delphi
    Par Hamza dans le forum Delphi
    Réponses: 6
    Dernier message: 24/02/2021, 08h15
  2. Manipulation des fichiers textes sous DELPHI
    Par riad.yahiaoui dans le forum Débuter
    Réponses: 9
    Dernier message: 24/04/2014, 16h47
  3. Comment créér une collection sous Delphi
    Par PsyKroPack dans le forum Langage
    Réponses: 6
    Dernier message: 11/02/2003, 13h20
  4. calcul sous delphi
    Par djedje-08 dans le forum Langage
    Réponses: 5
    Dernier message: 08/02/2003, 17h39
  5. Réponses: 4
    Dernier message: 27/03/2002, 11h03

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