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 actif

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut frantzgac
    Regarde ce lien sur le Forum
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  3. #3
    Membre actif

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    A tu teste le dernier code que je fournissais dans ce post
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  5. #5
    Membre actif

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    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
    Points : 3 766
    Points
    3 766
    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
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  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
    Points : 3 766
    Points
    3 766
    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() "
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  8. #8
    Membre actif

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    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
    Points : 3 766
    Points
    3 766
    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
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  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
    Points : 3 766
    Points
    3 766
    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 "
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  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
    Points : 3 766
    Points
    3 766
    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
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  12. #12
    Membre actif

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    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
    Points : 3 766
    Points
    3 766
    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");
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  14. #14
    Membre actif

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Desole mais la je ne sais plus, si je trouve quelque chose je le posterais
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  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
    Points : 3 766
    Points
    3 766
    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' !
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  17. #17
    Membre actif

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    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 actif

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    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
    Points : 3 766
    Points
    3 766
    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
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  20. #20
    Membre régulier 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
    Points : 104
    Points
    104
    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