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 :

C++ Builder COM PDFCreator


Sujet :

C++Builder

  1. #1
    Membre �clair�

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    502
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 502
    Par d�faut C++ Builder COM PDFCreator
    Bonjour

    J'ai besoin de produire un fichier PDF depuis C++ Builder 6.

    Pour cela il faut utiliser l'interface COM de PDFCreator par exemple ce que j'ai pu faire sans probl�me avec Delphi 7. Mais j'ai beaucoup de mal � transcrire ce code vers C++ Builder. Certes je peux faire une DLL Delphi appel� depuis C++ mais ce n'est gu�re �l�gant.

    Voic ce que je tente en me basant surs divers exemples glan�s sur le net (aucun ne portent sur PDFCreator sinon je n'aurais pas de probl�me)

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    TCOM_clsPDFCreator PDFCreator = CoclsPDFCreator::Create();
    Je pr�cise que j'ai g�n�r� l'unit� de contr�le du COM "PDFCreator_TLB"

    Cette instruction produit � l�ex�cution une erreur "classe d'exception char * Adresse de l'objet exception 0xbba26a".

    Par ailleurs l'application Delphi qui fonctionne elle, ne permet que de convertir un fichier (TXT ou RTF) vers PDF mais pas d'intercepter une impression (�tat fait avec QReport) dirig� vers PDFCreator. L� aussi il me manque un �l�ment.

  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

  3. #3
    Membre �clair�

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    502
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 502
    Par d�faut
    Bonjour

    malheureusement ce fil
    http://www.developpez.net/forums/d47...r-travail-pdf/
    d�crit les affres de quelqu'un qui ne parvient pas � ses fins. De plus il semble que le niveau de la conversation ne soit pas au top car je cite
    Effectivement, ca tourne pas rond dans l'import de la librairie de types, dans le .H on peut lire clairement

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    #error "This file requires a newer version of the header UTILCLS.H" \
           "You need to apply an update/patch to your copy of C++Builder"
    alors que ces lignes du fichier PDFCreator_TLB.h sont dont la port�e d'une compilation conditionnelle :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    #if !defined(__UTILCLS_H_VERSION) || (__UTILCLS_H_VERSION < 0x0600)
    ce qui signifie que l'unit� PDFCreator pr�voit le cas o� l'include UTILCLS.H ne serait pas coh�rent, et non qu'il y a effectivement une erreur.

    Ceci dit comme je parviens � faire fonctionner l'unit� PFDCreator g�n�r� par l'importation de librairies de type en Delphi, je pense que si je ne parviens pas � le faire en C++ c'est du fait de ma m�connaissance de la manipulation des classes produites par PFDCreator_TLB.

    C'est donc un sp�cialiste de ces questions qui pourrait peut �tre m'aider � utiliser ces derni�res que je mets ici en lien

    http://frantzgacogne.free.fr/ftp/pdfcreator_tlb.cpp

    http://frantzgacogne.free.fr/ftp/pdfcreator_tlb.h

  4. #4
    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
    A tu teste le dernier code que je fournissais dans ce post

  5. #5
    Membre �clair�

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    502
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 502
    Par d�faut
    Merci, eEffectivement j'�tais pass� un peu vite sur cette m�thode utilisant OLE. Voici le bout de code tent� :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Variant vPDFC, ProgramIsRunning;
    vPDFC = Variant::CreateObject("PDFCreator.clsPDFCreator");
    vPDFC.OleFunction("cStart", "/NoProcessingAtStart", false) = true;
    vPDFC.OlePropertySet("cVisible", true);
    vPDFC.OlePropertyGet("cOption", "UseAutosave") = true;
    vPDFC.OlePropertyGet("cOption", "UseAutosaveDirectory") = true;
    vPDFC.OleFunction("cConvertFile","h:\\Etudes\\EtudeCpp\\PDFCreator\\File1.txt","h:\_Etudes\\EtudeCpp\\PDFCreator\\file1.pdf","PDF/X");
    vPDFC.OleFunction("cShowLogfileDialog",true);
    vPDFC.OleFunction("cGetPDFCreatorPrinters");
    vPDFC.OleFunction("cPrintPDFCreatorTestpage");
    vPDFC.OleFunction("cClose");
    vPDFC = Unassigned;
    Jusqu'� la ligne
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    vPDFC.OlePropertyGet("cOption",
    �a passe en silence

    Celle ci
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    vPDFC.OleFunction("cConvertFile","h:\\Etudes\\EtudeCpp\\PDFCreator\\File1.txt","h:\_Etudes\\EtudeCpp\\PDFCreator\\file1.pdf","PDF/X");
    provoque l'erreur EoleSysError "nom inconnu"

    Tandis que
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    vPDFC.OleFunction("cGetPDFCreatorPrinters");
    vPDFC.OleFunction("cPrintPDFCreatorTestpage");
    celles ci ne font rien...

    Je me suis aussi inspir� de
    http://www.codeproject.com/Articles/...ord-Automation
    qui traite d'un sujet diff�rent mais de la m�me technologie

    je pense que pour aller plus loin je vais devoir �tudier de pr�s "OLE"

  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
    malheureusement oui tu va devoir regarder du cote de Ole et connaitre les joies des erreurs incomprensibles, mais avec l'experience on arrive a traduire des fonctions d'un autre language vers BCB, et puis il y a toujours le Forum.
    pour ta ligne qui donne une erreur, est tu sur de tes chemins des fichiers source et destination sinon j'ai trouve ceci, a adapter
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Variant retVal;
    Variant PDFCreator = CreateOleObject("PDFCreator.clsPDFCreator");
    retVal = PDFCreator.OleFunction("cStart","/NoProcessingAtStartup");
    //PDFCreator.OlePropertySet ("cOption","UseAutoSave",1);
    retVal = PDFCreator.OleFunction("cConvertFile",eSrcFile->Text,eDstFile->Text,"PDF/X");
    retVal = PDFCreator.OleFunction("cClose");
    PDFCreator = Unassigned;
    je te post un bout de code trouve dans mes archives, si je retrouve la liste des fonctions je la posterais
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //#include "utilcls.h"
    //#include "comobj.hpp"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    Variant vPDFC, ProgramIsRunning, vPDFCError;
    String DefaultPrinter;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    // on teste si PDFCreator est deja execute
    // si oui
    try
            {
            vPDFC = Variant::GetActiveObject("PDFCreator.clsPDFCreator");
            }
    // si non
    catch(...)
            {
            vPDFC = Variant::CreateObject("PDFCreator.clsPDFCreator");
            }
    vPDFCError = Variant::CreateObject("PDFCreator.clsPDFCreatorError");
    Variant pdfOptions = vPDFC.OlePropertyGet("cOptions");
    vPDFC.OleFunction("cStart", "/NoProcessingAtStart", false) = true;
    //ProgramIsRunning = vPDFC.OleProcedure("cProgramIsRunning");
    //bool visible = vPDFC.OlePropertyGet("cVisible");
    vPDFC.OlePropertySet("cVisible", true);
    //int etatWindow = vPDFC.OlePropertyGet("cWindowState");
    //vPDFC.OlePropertySet("cWindowState", 0);
    //String version = vPDFC.OlePropertyGet("cWindowsVersion");
    DefaultPrinter = vPDFC.OlePropertyGet("cDefaultPrinter");
    vPDFC.OlePropertySet("cDefaultPrinter", "PDFCreator");
    String vPDFPath = "C:\\";
    pdfOptions.OlePropertyGet("AutosaveDirectory") = vPDFPath;
    //vPDFC.OlePropertyGet("cOption", "AutosaveDirectory") = vPDFPath;
    String vPDFName = "teste_memo"; // extension .pdf
    //vPDFC.OlePropertyGet("cOption", "AutosaveFilename") = vPDFName;
    pdfOptions.OlePropertyGet("AutosaveFilename") = vPDFName;
    //vPDFC.OlePropertyGet("cOption", "UseAutosave") = true;
    pdfOptions.OlePropertyGet("UseAutosave") = true;
    //vPDFC.OlePropertyGet("cOption", "UseAutosaveDirectory") = true;
    pdfOptions.OlePropertyGet("UseAutosaveDirectory") = true;
    // 0=PDF, 1=Png, 2=jpg, 3=bmp, 4=pcx, 5=tif, 6=ps, 7=eps, 8=txt
    //vPDFC.OlePropertyGet("cOption", "AutosaveFormat") = 0;
     
    vPDFC.OlePropertySet("cOption", "cClearCache", true);
    //vPDFC.OleFunction("cAddPrintjob", "C:\\teste_memo.txt");
    //String prntjbname = vPDFC.OlePropertyGet("cPrintjobFilename", 1);
    //int a = vPDFC.OlePropertyGet("cCountOfPrintjobs");
    //bool printstop = vPDFC.OlePropertyGet("cPrinterStop");
    vPDFC.OleFunction("cPrintFile", "teste_memo.pdf");
    vPDFC.OlePropertySet("cPrinterStop", false);
    vPDFC.OleFunction("cPrintFile", "teste_memo.txt");
    //Variant vVersion = vPDFC.OlePropertyGet("cGhostscriptVersion");
    HWND hwnd;
    hwnd = FindWindow("ThunderRT6FormDC", "PDFCreator - Moniteur d'impression PDF");
    OpenIcon(hwnd);
    BringWindowToTop(hwnd);
     
    vPDFCError = vPDFC.OlePropertyGet("cError");
    int eNumber = vPDFC.OlePropertyGet("cErrorDetail", "Number");
    String eDetail = vPDFC.OlePropertyGet("cErrorDetail", "Description");
    //vPDFCError = vPDFC.OlePropertyGet("cErrorDetail");
    //DefaultPrinter = vPDFC.OlePropertyGet("cDefaultPrinter");
    //vPDFC.OleFunction("cGetLogfile");
    //vPDFC.OlePropertyGet("cProgramRelease", true);
    //vPDFC.OlePropertyGet("cProgramIsRunning") = true;
    //vPDFC.OlePropertyGet("cPDFCreatorApplicationPath");
    //vPDFC.OleFunction("cClose");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    vPDFC.OlePropertySet("cDefaultPrinter", DefaultPrinter.c_str());
    vPDFC.OleFunction("cClose");
    }
    //---------------------------------------------------------------------------
    toutes ces fonctions n'avaient pas �t� teste

  7. #7
    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
    Tu va peut essayer de passer tes noms de chemins comme ceci
    " WideString("h:\\Etudes\\EtudeCpp\\PDFCreator\\File1.txt"),WideString("h:\_Etudes\\EtudeCpp\\PDFCreator\\file1.pdf") " ou " ("h:\\Etudes\\EtudeCpp\\PDFCreator\\File1.txt").c_str(),("h:\_Etudes\\EtudeCpp\\PDFCreator\\file1.pdf").c_str() "

  8. #8
    Membre �clair�

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    502
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 502
    Par d�faut
    Bonjour

    merci beaucoup de tes id�es et sources. J'avais oubli� de pr�ciser que le message "nom inconnu" venait tr�s probablement d'une non reconnaissance de la fonction elle m�me car le d�bogueur la trouve dans cette portion du code sysvari.h

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     template <class P1, class P2, class P3>
      Variant Variant::OleFunction(const String& name, P1 p1, P2 p2, P3 p3)
      {
        TAutoArgs<3> args;
        args[1] = p1;  args[2] = p2;  args[3] = p3;
        return OleFunction(name, static_cast<TAutoArgsBase*>(&args));
      }
    J'ai tout de m�me test� avec WideString, et aussi avec c_str(). Cela produit le m�me message. Donc la fonction cConvertFile semble bien �tre ce qui est "inconnu".

    J'ai aussi test� le bout de code commen�ant par
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Variant PDFCreator = CreateOleObject("PDFCreator.clsPDFCreator");
    mais l'appel de la fonction cConvertFile provoque la m�me erreur.

    Ai je un moyen de v�rifier les fonctions accessibles de l'objet OLE ? Je trouve pourtant bien cette fonction dans PDFCreator_OCX.h et dans PDFCreator_OCX.obj.

  9. #9
    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
    voici ce que j'ai trouve sur le site PDFCretor le lien
    ceci
    Public Sub cConvertFile(ByVal InputFilename As String, ByVal OutputFilename As String, Optional ByVal SubFormat As String = "") ' Allowed values for 'SubFormat': "PDF/A-1b" for "PDF/A-1b"files; "PDF/A-2b" for "PDF/A-2b"files; "PDF/X" for "PDF/X"-files

  10. #10
    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
    Je ne suis pas arrive a faire fonctionner " cConvertFile ", mais j'arrive a convertir un fichier texte
    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
     
    // on teste si PDFCreator est deja execute
    // si oui
    try
            {
            vPDFC = Variant::GetActiveObject("PDFCreator.clsPDFCreator");
            }
    // si non
    catch(...)
            {
            vPDFC = Variant::CreateObject("PDFCreator.clsPDFCreator");
            }
    Variant pdfOptions = Variant::CreateObject("PDFCreator.clsPDFCreatorOptions");
    vPDFC.OleFunction("cStart", "/NoProcessingAtStart", true); // = true;
    vPDFC.OlePropertySet("cVisible", true);
    vPDFC.OlePropertyGet("cOption", "UseAutosave") = true;
    vPDFC.OlePropertySet("cOption", "AutoSaveFormat", 0);
    vPDFC.OlePropertyGet("cOption", "UseAutosaveDirectory") = true;
    DefaultPrinter = vPDFC.OlePropertyGet("cDefaultPrinter");
    vPDFC.OlePropertySet("cDefaultPrinter", "PDFCreator");
    vPDFC.OleFunction("cClearcache");
    // page de teste par default
    vPDFC.OleFunction("cPrintPDFCreatorTestpage");
    // conversion du fichier essai.txt en essai.pdf
    vPDFC.OleFunction("cPrintfile", "C:\\Users\\home\\Documents\\PDFCreator\\essai.txt");
    vPDFC.OlePropertySet("cPrinterStop", 0);
    apres cet essai je pense qu'il manque quelque chose avant d'appeler " cConvertFile "

  11. #11
    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
    Apres de nombreuses recherches j'ai trouve ceci
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    objExcel.ActiveWorkbook.PrintOut , , , , PrinterName, True, , tempFile
    PDFCreator.cConvertFile tempFile, outputFile
     
    objPowerpoint.ActivePresentation.PrintOut , , tempFile
    PDFCreator.cConvertFile tempFile, outputFile
     
    objWord.PrintOut False, , , tempFile, , , , , , , True 
    PDFCreator.cConvertFile tempFile, outputFile
    Apparemment cConvertFile demande que le syst�me d'impression dans ces trois cas soit active par Word ou Excel ou Powerpoint

  12. #12
    Membre �clair�

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    502
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 502
    Par d�faut
    Bonjour

    je ne souhaite pas que les PC o� j'installe mon soft aient obligatoirement Office.

    J'ai assaini l'environnement en d�sinstallant PDFCreator, les librairies de type puis en r�installant le tout.

    J'arrive � obtenir le m�me r�sultat en C++ qu'en Delphi � un d�tail pr�s : je ne contr�le pas l�ex�cution de PDFCreator car je ne sais pas (encore) initialiser les �v�nements COM PDFCreator.OneError et PDFCreator.OneReady en C++. A part ceci le code suivant fonctionne et produit une copie PDF d'un fichier TXT. A suivre... Merci !

    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
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    WideString FileS="h:\\Etudes\\EtudeCpp\\PDFCreator\\File1.txt";
    WideString FileD=ExtractFileName(ChangeFileExt(FileS,""));
    AnsiString DefaultPrinter;
     
    if (!FileExists(FileS)) {
            MessageDlg("Fichier source introuvable",mtInformation, TMsgDlgButtons() << mbOK, 0);
            return;                }
     
    Variant vPDFC;
    vPDFC = Variant::CreateObject("PDFCreator.clsPDFCreator");
    vPDFC.OleFunction("cStart", "/NoProcessingAtStart", false) = true;
    vPDFC.OlePropertySet("cVisible", false);
    vPDFC.OlePropertySet("cOption", "UseAutosave",1);
    vPDFC.OlePropertySet("cOption", "AutosaveFormat",0); // PDF
    vPDFC.OlePropertySet("cOption", "AutosaveDirectory",WideString(ExtractFilePath(FileS))) ;
    vPDFC.OlePropertySet("cOption", "AutosaveFilename",FileD);
     
    DefaultPrinter=vPDFC.OlePropertyGet("cDefaultPrinter");
    vPDFC.OlePropertySet("cDefaultPrinter","PDFCreator");
    vPDFC.OleProcedure("cClearCache");
     
    vPDFC.OleProcedure("cPrintFile",WideString(FileS));
    Timer1->Enabled=true;
    while (Timer1->Enabled)
            Application->ProcessMessages();
    Shape1->Brush->Color=clGreen;
     
    vPDFC.OlePropertySet("cDefaultPrinter",WideString(DefaultPrinter));
    vPDFC.OleProcedure("cClose");
    vPDFC=Unassigned;
    }

  13. #13
    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
    Pour PDFCreator.OneError il y a ceci
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Variant vPDFCError = Variant::CreateObject("PDFCreator.clsPDFCreatorError");
     
    vPDFCError = vPDFC.OlePropertyGet("cError");
     
    int eNumber = vPDFC.OlePropertyGet("cErrorDetail", "Number");
     
    String eDetail = vPDFC.OlePropertyGet("cErrorDetail", "Description");
     
    vPDFCError = vPDFC.OlePropertyGet("cErrorDetail");

  14. #14
    Membre �clair�

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    502
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 502
    Par d�faut
    oui, merci. Mais je souhaite surtout pouvoir surveiller le moteur PDFCreator depuis le programme pour lib�rer les ressources une fois que l'impression est termin�e ce qui est signal� par �v�nement g�r� par OneReady.

    Mais il ne semble pas que l'objet COM PDFCreator de Builder C++ contiennent le gestionnaire d'�venement "OneReady". Seul l'objet Ghost le contient.
    PDFCreator_OCX.h :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    TOLEBOOL __fastcall cGhostscriptRun(LPSAFEARRAY* Arguments/*[in,out]*/)
    ...
    private:
      TNotifyEvent                   FOneReady;
      TNotifyEvent                   FOneError;
    ...
    contrairement � l'objet COM de delphi 7
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    TclsPDFCreator = class(TOleServer)
      private
        FOneReady: TNotifyEvent;
        FOneError: TNotifyEvent;
        FIntf:        _clsPDFCreator;
    Je ne sais pas exactement ce qu'on peut faire avec Ghost...

    R�sum� de mes travaux de recherche

    1 En Delphi 7 je r�ussis � convertir en PDf un fichier quelconque, sans interaction, tout en contr�lant PDFCreator, c'est � dire en attendant qu'il est fini pour lib�rer les ressources (�v�nement OneReady)

    2 Je parviens � faire la m�me chose en BCB6 sans contr�le de PDFCreator.

    3 Je ne parviens pas en Delphi � imprimer un �tat produit par QuickReport en emp�chant PDFCreator d'ouvrir deux fen�tres (nom et emplacement du fichier) ce qui est mon but ultime.

  15. #15
    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
    Desole mais la je ne sais plus, si je trouve quelque chose je le posterais

  16. #16
    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 trouve ceci
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    Variant vPDFC;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
         : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    /*
    If  .cStart( "/NoProcessingAtStartup" ) =  False Then 
              cmdExecute.Enabled =  False
              AddStatus  "Impossible d'initialiser PDFCreator."
    */
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    // on teste si PDFCreator est deja execute
    // si oui
    try
            {
            vPDFC = Variant::GetActiveObject("PDFCreator.clsPDFCreator");
            }
    // si non
    catch(...)
            {
            vPDFC = Variant::CreateObject("PDFCreator.clsPDFCreator");
            }
    if(vPDFC.OleFunction("cStart", "/NoProcessingAtStart") = false)
         {
         ShowMessage("Impossible d'initialiser PDFCreator.");
         return;
         }
    vPDFC.OleFunction("cTestEvent", "Ready");
    vPDFC.OleFunction("cTestEvent", "Error");
    vPDFC.OleFunction("cTestEvent", "Unknown");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::PDFCreator_eReady() // voir si eReady()
    {
    Label1->Caption = "Ready!";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::PDFCreator_eError() // voir si eError()
    {
    Label2->Caption = vPDFC.OlePropertyGet("cErrorDetail", "Number");
    Label3->Caption = vPDFC.OlePropertyGet("cErrorDetail", "Description");
    }
    //---------------------------------------------------------------------------
    Le code compile mais je ne l'ai pas teste, c'est tire de la Doc
    Public Sub cTestEvent(ByVal EventName As String)

    Ev�nements
    Public Event eError()
    Public Event eReady()


    10 messages d'erreurs pour les �v�nements existent :
    -2 Ev�nement inconnu !
    -1 Test Error Event.
    1 Le serveur ActiveX n'a pas �t� d�marr� ! Merci d'utiliser la fonction "cStart()" pour lancer le serveur ActiveX !
    2 Une instance de PDFCreator est d�j� en cours d'ex�cution. On ne peut ex�cuter plus d'une instance !
    3 Nom d'option inconnu '%1' dans '%2' !
    4 Erreur Ghostscript : '%1' !
    5 Le fichier '%1' n'a pu �tre trouv� !
    6 Chemin invalide '%1' !
    7 Le fichier '%1' est en cours d'utilisation !
    8 Fonction '%1': Options1 n'est pas de type 'clsPDFCreatorOptions' !
    9 Fichier postscript invalide '%1' !

  17. #17
    Membre �clair�

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    502
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 502
    Par d�faut
    Merci

    J'ai utilis� le code post� mais sans esp�rer grand chose attendu que pour que l��v�nement eReady soit trait� par la proc�dure eReady il faudrait quelque part passer son adresse. La fonction eReady ne sera donc jamais appel�e. Il doit manquer quelque chose...

    Comme cTestEvent retourne un HRESULT j'ai tent� de l'utiliser dans une boucle d'attente mais elle renvoie toujours z�ro.

  18. #18
    Membre �clair�

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    502
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 502
    Par d�faut
    Ce code fonctionne. Il convertir un fichier quelconque en PDF. Merci � Blondelle qui a entretenu ma d�termination.

    J'�choue encore sur les points suivants:

    Il n'est pas possible de contr�ler PDFCreator (savoir quand la conversion est finie)
    Mon but final est de produire un PDF � partir d'une QuickReport et non d'un fichier. (le QuickReport existe et est assez complexe)


    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
     
    TCOM_clsPDFCreator PDFCreator; // variable globale
    ...
    {
    WideString Parameters="/NoProcessingAtStart";
    TCOM_clsPDFCreatorOptions Opt;
    WideString FileS;
    bool Ret;
     
    Shape1->Brush->Color=clWhite;
     
    OpenDialog1->InitialDir=GetCurrentDir();
     
    if (!OpenDialog1->Execute())
            return;
     
    FileS=OpenDialog1->FileName;
     
    PDFCreator = CoclsPDFCreator::Create();
     
    if (!PDFCreator->cStart(Parameters,Ret))        {
            MessageDlg("Le serveur PDF ne peut être démarré",
                   mtInformation, TMsgDlgButtons() << mbOK, 0);
            return;
            }
     
    if (!FileExists(FileS)) {
            MessageDlg("Fichier absent",
                   mtInformation, TMsgDlgButtons() << mbOK, 0);
            return;
            }
     
    if (!PDFCreator->cIsPrintable(FileS))   {
            MessageDlg("Fichier non imprimable",
                   mtInformation, TMsgDlgButtons() << mbOK, 0);
            return;
            }
     
    Opt=CoclsPDFCreatorOptions::Create();
    Opt=PDFCreator->cOptions;
    Opt->set_AutosaveDirectory(WideString(ExtractFilePath(FileS)));
    Opt->set_AutosaveFilename(WideString(ChangeFileExt(ExtractFileName(FileS),"")));
    Opt->set_AutosaveFormat(0);
    Opt->set_UseAutosave(1);
     
    PDFCreator->cClearCache();
    PDFCreator->set_cVisible(0);
     
    PDFCreator->_set_cOptions(Opt);
    //PDFCreator->cOptions=Opt; écriture équivalente
     
    PDFCreator->set_cPrinterStop(false);
    PDFCreator->set_cDefaultPrinter(WideString("PDFCreator"));
    PDFCreator->cPrintFile(FileS);
     
    int t1=PDFCreator->get_cCountOfPrintjobs();     // donne toujours zéro
     
    Sleep(5000); // sans cette attente les paramètres passés n'ont plus d'effet
     
    int t2=PDFCreator->get_cCountOfPrintjobs();     // donne toujours zéro
     
    PDFCreator->cClose();   // Dans la liste des tâches PDFCreator reste présent malgré cette instruction
     
    if (PDFCreator->get_cIsClosed())
            Shape1->Brush->Color=clGreen; // finit toujours à Green
    else
            Shape1->Brush->Color=clRed;
     
    Label1->Caption=Format("%s %s %d %d",ARRAYOFCONST((Opt->get_AutosaveDirectory(),Opt->get_AutosaveFilename(),t1,t2)));
     
    delete PDFCreator;

  19. #19
    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
    Merci frantzgac
    Je pense que c'est possible mais la ca depasse mes comp�tences.
    J'ai regarde tes fichiers postes en debut de Post " cTestEvent " est defini dans deux Class deux Template on doit pouvoir recuperer quelque chose a partir de la en utilisant les commandes Com, mais je sais pas faire peut etre que quelqu'un aura l'idee de genie

  20. #20
    Membre confirm� Avatar de marcootz
    Homme Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    159
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 159
    Par d�faut
    Salut frantzgac,

    Pour ma part, pour g�n�rer un pdf � partir d'une fiche QuickReport, j'utilise le composant QrPdfFilter fourni avec quickreport.

    Pour lancer la cr�ation du pdf :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    TQRPDFDocumentFilter *aPDFFilt;
    	aPDFFilt = new TQRPDFDocumentFilter(ton fichier);
    	ptCourbe->QuickRep1->ExportToFilter(aPDFFilt);
    	delete aPDFFilt;
    Tu as peut-�tre d�j� essayer mais c'est au cas o�.

    A+

Discussions similaires

  1. PDFCreator et COM, imprimer une seule page
    Par Papy214 dans le forum API, COM et SDKs
    R�ponses: 0
    Dernier message: 14/02/2013, 17h15
  2. G�rer port com virtuel en builder 5
    Par phil2fer dans le forum C++
    R�ponses: 9
    Dernier message: 28/09/2012, 08h33
  3. Matlab COM Builder
    Par poisson16 dans le forum MATLAB
    R�ponses: 1
    Dernier message: 17/06/2007, 20h29
  4. Outils, cours et NOUVEAUX tutoriels pour Borland C++Builder
    Par hiko-seijuro dans le forum C++Builder
    R�ponses: 10
    Dernier message: 12/03/2006, 22h33
  5. R�ponses: 2
    Dernier message: 20/03/2002, 23h01

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