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++Builder Discussion :

pilotage OLE : Builder -> Word -> pdf


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de LotfiB
    Inscrit en
    Août 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 117
    Par défaut pilotage OLE : Builder -> Word -> pdf
    Bonjour

    Je cherche à imprimer en pdf via OLE sous C++ Builder.
    J'ai Adobe acrobat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        WordDocument1->Save();  // ici on sauve un document
        // imprime ds un pdf
        WordApplication1->ActivePrinter = (Variant)(EditPrinterName->Text);
        WordDocument1->PrintOut();
    ça marche mais ça me demande le nom du fichier pdf en boite de dialogue... pour de l'automation, c'est pas terrible.
    Y a t il moyen de contourner ça et d'imposer un nom de fichier avant le printout ?

    De plus, est ce que l'on peut aussi mettre les options d'Acrobat : protection du document : impression autorisée mais pas de sélection/copy ?

    Merci

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut LotfiB
    Quand la boite de dialogue s'ouvre tu est dans l'application Word, je ne connais pas de commandes qui permettent de valider la boite de dialogue par default, la seule solution que j'ai trouve c'est d'ouvrir un Thread juste avant la commande " WordDocument1->PrintOut(); " de rechercher le Handle de la fenetre puis celui du Boutton Enregistrer et de simuler l'appuie sur ce boutton

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Un bout de code qui fonctionne chez moi selon cette idee
    le .h
    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
     
    //---------------------------------------------------------------------------
    #ifndef Save_PDFH
    #define Save_PDFH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    //---------------------------------------------------------------------------
    class TMonThread : public TThread
    {
    private:
    protected:
            void __fastcall Execute();
    public:
            __fastcall TMonThread(bool CreateSuspended);
    };
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components
            TButton *Button1;
            void __fastcall Button1Click(TObject *Sender);
    private: // User declarations
    public:  // User declarations
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    le .cpp
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Save_PDF.h"
    #include <utilcls.h>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
     Variant  vMSWord, vWDocuments, vWDocument;
     char sz[256];
     TMonThread *MonThread;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     vMSWord = Variant::CreateObject("Word.Application");
     vMSWord.OlePropertySet("Visible", true);
     vWDocuments = vMSWord.OlePropertyGet("Documents");
     vWDocument = vWDocuments.OleFunction("Add");
     vMSWord.OlePropertyGet("ActivePrinter", "Acrobat Distiller");
     MonThread = new TMonThread(false);
     vWDocument.OleFunction("PrintOut");
    }
    //---------------------------------------------------------------------------
    __fastcall TMonThread::TMonThread(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TMonThread::Execute()
    {
            //---- Placer le code du thread ici ----
     HWND hwnd;
     HWND hwnd1;
     do
    {
     hwnd = FindWindow("#32770","Enregistrer le fichier PDF sous");
     hwnd1 = FindWindowEx(hwnd, NULL, "Button", "&Enregistrer"); // Button
     GetWindowText(hwnd, sz, 256);
    }
     while(strcmp(sz, "Enregistrer le fichier PDF sous"));
     PostMessage(hwnd1,WM_KEYDOWN,VK_RETURN,0);
     PostMessage(hwnd1,WM_KEYUP,VK_RETURN,0);
     delete MonThread;
    }

  4. #4
    Membre confirmé Avatar de LotfiB
    Inscrit en
    Août 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 117
    Par défaut
    Merci pour ta réponse
    chapeau
    entre temps, j'ai trouvé une parade mais bien moins belle :
    ouvrir word avant de lancer le programme, et ds le propriétés de l'imprimante d'acrobat
    c'est de lui dire que le nom par defaut est document\.pdf

    mais ça se Reset à la sortie de word, donc on doit lancer word manuellement :-(

    sinon, la 2eme question de mon Post :
    sais tu comment piloter Adobe pour changer les protections du fichier
    en fait, en mettre pour empecher le copier, et laisser uniquement l'impression ?

    Merci

  5. #5
    Membre confirmé Avatar de LotfiB
    Inscrit en
    Août 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 117
    Par défaut
    finalement ça ne marche pas
    le thread ne trouve pas la boite de dialogue
    pourtant les handles sont corrects
    il l'a trouvé une fois qd j'ai fais du pas à pas, ou un breakpoint ds le thread
    sinon, tout seul il ne le trouve pas
    ???
    je suis sous Vista, je compile en debug...
    est ce une question de focus / modal ?

    en fait il exécute
    PostMessage(hwnd1,WM_KEYDOWN,VK_RETURN,0);
    PostMessage(hwnd1,WM_KEYUP,VK_RETURN,0);
    delete MonThread;

    avant meme que je ne vois le Dlg !
    et le Dlg apparait alors
    comme s'il fallait mettre une pause avant le 1er PostMessage ???

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    J'ai teste le code sur Word 2003
    Normalement la boucle Do While permet d'attendre l'ouverture de la boite de dialogue.
    Il est peut etre possible de remplacer " PostMessage " par " SendMessage ", mais je ne suis pas sur

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

Discussions similaires

  1. Export Word vers PDF : pilotage du composant ActiveX PDFCreator
    Par Phifi dans le forum Vos contributions VB6
    Réponses: 7
    Dernier message: 02/03/2012, 16h40
  2. [WORD] pilotage ole Delphi
    Par missmarion dans le forum API, COM et SDKs
    Réponses: 19
    Dernier message: 28/09/2010, 11h19
  3. Pilotage OLE WORD - Remplacer des termes-
    Par bru-no dans le forum C++Builder
    Réponses: 10
    Dernier message: 19/03/2007, 22h51
  4. Pilotage OLE Word avec Visual C++
    Par baka02 dans le forum MFC
    Réponses: 2
    Dernier message: 20/03/2006, 13h04
  5. Pilotage Ole de word
    Par beauchastel dans le forum Langage
    Réponses: 6
    Dernier message: 10/01/2006, 10h43

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