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

 .NET Discussion :

generation pdf avec PdfCreator


Sujet :

.NET

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 38
    Points : 29
    Points
    29
    Par défaut generation pdf avec PdfCreator
    Salut tout le monde,

    Je suis entrain de développer une application qui permet de présenter une partie de ma base en docx et en pdf (par ex mes fiches clientes).
    Aujourd'hui ma génération de docx fonctionne ainsi que ma génération de pdf...
    Mais... j'ai tout de même un problème avec la génération du pdf...
    La génération du docx et pdf se fait pour chaque client, et pour cela je passe par une boucle.
    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
                foreach (Client client in listClient)
                {
                    CreateDocx createDocx = new CreateDocx();
                    createDocx.InPath = @"C:\";
                    createDocx.InNameFile = "modele.docx";
                    createDocx.OutPath = @"C:\";
                    createDocx.OutNameFile = client.Id + "_" + client.Firstname + client.Lastname + ".docx";
                    createDocx.Client = client;
                    createDocx.generate();
     
                    ConvertInPdf_V1 convertInPdf_V1 = new ConvertInPdf_V1();
                    convertInPdf_V1.InPath = @"C:\";
                    convertInPdf_V1.InFile = client.Id + "_" + client.Firstname + client.Lastname + ".docx";
                    convertInPdf_V1.OutPath = @"C:\";
                    convertInPdf_V1.OutFile = client.Id + "_" + client.Firstname + client.Lastname + ".pdf";
                    convertInPdf_V1.toConvert();
                }
    La boucle est "trop rapide"... lorsque que je génére le pdf du premier client, elle n'est pas terminée que j'ai l'instruction pour généré le deuxième document qui est excécuté... ce qui fait que ça stop la génération du premier. Je n'ai que le pdf du dernier client à chaque fois...
    Si je passe en mmode pas à pas, aucun soucis car le temps que j'avance ligne par ligne le pdf à eu le temps de se générer...

    Bon je ne suis pas si je suis super clair, mais je suis là pour apporter plus de précisions...

    Merci d'avance!

  2. #2
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Je pense que ça pourrait être pas mal de vérifier que pdfCreator est fermé avant de commencer le tour suivant de boucle mais je ne vois pas trop comment faire... Je ne suis pas un pro dans tout ce qui est écouteur...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Problem Solved

    En faite je cherchais compliqué... J'ai trouvé une solution, dites moi si ça vous semble propre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (!File.Exists(outPath + outFile))
                {
                }
    Tout le temps que le fichier n'est pas créé, je ne continue pas le programme...

    La boucle while ne me semble pas top top... une meilleur idée?

  4. #4
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Effectivement ce n'est pas propre.

    Le mieux à mon avis serait de passer par des thread et faire des join() si tu veux que ça imprime fiche séquentiellement.

    Tu trouveras toutes les infos dont tu as besoin sur la MSDN.
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Ok, je viens de regarder pas mal de trucs pour compléter mes connaissance sur les thread et notament join(). Je prense bien comprendre le focntionnement mais je ne vois pas comment l'appliquer. En effet je ne peux pas écouter le travail d'un composant que je ne connais pas, dans mon cas PDFCrator. J'ai acces aux classes qui lancent la convertion, mais je n'ai pas moyen de savoir ou ça en est puisque c'est une appli externe, non?

    Y'a t-il des évenements sur la création d'un fichier?


    ps : merci pour ta réponse!

  6. #6
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Il suffit que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CreateDocx createDocx = new CreateDocx();
                    createDocx.InPath = @"C:\";
                    createDocx.InNameFile = "modele.docx";
                    createDocx.OutPath = @"C:\";
                    createDocx.OutNameFile = client.Id + "_" + client.Firstname + client.Lastname + ".docx";
                    createDocx.Client = client;
                    createDocx.generate();
     
                    ConvertInPdf_V1 convertInPdf_V1 = new ConvertInPdf_V1();
                    convertInPdf_V1.InPath = @"C:\";
                    convertInPdf_V1.InFile = client.Id + "_" + client.Firstname + client.Lastname + ".docx";
                    convertInPdf_V1.OutPath = @"C:\";
                    convertInPdf_V1.OutFile = client.Id + "_" + client.Firstname + client.Lastname + ".pdf";
                    convertInPdf_V1.toConvert();
    Soit exécuté depuis un Thread.
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Merci, je test ça!

    le résultat demain...

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    En faite reponse aujourd'hui...
    run(Object obj) etant le code d'avant...

    foreach (Client client in listClient)
    {
    Thread test = new Thread(run);
    test.Name = client.Id.ToString();
    test.Start(client);
    test.Join();
    }
    Donc je lance bien à travers un thread, et j'attend que celui-ci soit fini d'executer avant d'entamer mon autre tour de boucle. Non?

    Et bien le résultat n'est pas bon...
    Dit moi que j'ai oublié un truc...

  9. #9
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    J'aurai plutôt écrit :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Thread test = new Thread(new ThreadStart(run));
    test.Start();
    test.Join();

    Mais ça doit revenir au même.

    Qu'est-ce qui ne marche pas ?
    Peux-tu donner un peu de détail sur l'exécution?
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Voici mon programme

    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
    static void Main(string[] args)
            {
                List<Client> listClient = new List<Client>();
                listClient = ClientDAO.selectAllClient();
     
                foreach (Client client in listClient)
                {
                    Thread test = new Thread(run);
                    test.Name = client.Id.ToString();
                    test.Start(client);
                    test.Join();
                }
            }
     
            public static void run(object obj)
            {
                Client client = (Client)obj;
     
                CreateDocx createDocx = new CreateDocx();
                createDocx.InPath = @"C:\";
                createDocx.InNameFile = "modele.docx";
                createDocx.OutPath = @"C:\";
                createDocx.OutNameFile = client.Id + "_" + client.Firstname + client.Lastname + ".docx";
     
                createDocx.Client = client;
                createDocx.generate();
     
                ConvertInPdf_V1 convertInPdf_V1 = new ConvertInPdf_V1();
                convertInPdf_V1.InPath = @"C:\";
                convertInPdf_V1.InFile = client.Id + "_" + client.Firstname + client.Lastname + ".docx";
                convertInPdf_V1.OutPath = @"C:\";
                convertInPdf_V1.OutFile = client.Id + "_" + client.Firstname + client.Lastname + ".pdf";
                convertInPdf_V1.toConvert();
            }
    voici ma classe convertInPdf

    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
    89
    90
    91
    92
    93
    94
    95
    class ConvertInPdf_V1
        {
            private const int maxTime = 20;
            private PDFCreator.clsPDFCreator _PDFCreator;
            private PDFCreator.clsPDFCreatorError pErr;
            private bool ReadyState;
            private string inPath;
            private string inFile;
            private string cleRegistre_PdfCreator = @"SOFTWARE\PDFCreator\Program";
            private string outPath;
            private string outFile;
            private string fichier;
     
            public ConvertInPdf_V1() { }
     
     
            public void toConvert()
            {
                fichier = inPath + inFile;
                if(fichier.Length>0)
                    convertirEnPdf();              
            }
     
     
     
            private void _PDFCreator_eReady()
            {
                _PDFCreator.cPrinterStop = true;
                ReadyState = true;
            }
     
            private void _PDFCreator_eError()
            {
                pErr = _PDFCreator.cError;
            }
     
            private void imprimerPDF(string unfichier)
            {
                string DefaultPrinter;
     
                Console.WriteLine("Conversion du document en cours...");
     
                //On change les paramètres de PDF Creator            
                RegistryKey rk = Registry.CurrentUser.OpenSubKey(cleRegistre_PdfCreator, true);
                rk.SetValue("AutosaveDirectory", inPath, RegistryValueKind.Unknown);
                rk.SetValue("AutosaveFilename", inFile, RegistryValueKind.Unknown);
                rk.SetValue("UseAutosave", "1", RegistryValueKind.Unknown);
     
                #region On lance l'impression
     
                PDFCreator.clsPDFCreatorOptions opt;
                _PDFCreator = new PDFCreator.clsPDFCreator();
                _PDFCreator.eError += new PDFCreator.__clsPDFCreator_eErrorEventHandler(_PDFCreator_eError);
                _PDFCreator.eReady += new PDFCreator.__clsPDFCreator_eReadyEventHandler(_PDFCreator_eReady);
                DefaultPrinter = _PDFCreator.cDefaultPrinter;
                _PDFCreator.cDefaultPrinter = "PDFCreator";
                _PDFCreator.cStart("/NoProcessingAtStartup", true);
                _PDFCreator.cPrinterStop = false;
                opt = _PDFCreator.cOptions;
                opt.UseAutosave = 1;
                opt.UseAutosaveDirectory = 1;
                opt.AutosaveFormat = 0;
                _PDFCreator.cOptions = opt;
                _PDFCreator.cClearCache();
                _PDFCreator.cVisible = true;
                _PDFCreator.cPrintFile(unfichier);
                _PDFCreator.cPrinterStop = false;
                ReadyState = false;
                _PDFCreator.cPrinterStop = true;
                _PDFCreator.cDefaultPrinter = DefaultPrinter;
                _PDFCreator.cClose();
                //while (!File.Exists(outPath + outFile))
                //{
                //}
                System.Runtime.InteropServices.Marshal.ReleaseComObject(_PDFCreator);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(pErr);
                pErr = null;
                GC.Collect();
                GC.WaitForPendingFinalizers();
     
                #endregion
            }
     
            private void convertirEnPdf()
            {
                try
                {
                    if (File.Exists(fichier))
                        imprimerPDF(fichier);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Erreur : " + ex.Message);
                }
            }
    Bon ça fait un peu bourrin de tout claquer le code...


    Le problème est que mon programme dit à PDFCreator : "tiens converti moi ce docx en pdf" et après mon programme continu sans se soucier de ce que fait pdfCreator, or c'est justement ça qui pose problème...
    Je ne trouve pas le moyen de communiquer avec pdfCreator et savoir ou il en est dans la conversion...

  11. #11
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Je viens de comprendre le soucis...

    En fait quand tu fais un "convertInPdf_V1.toConvert();", ton programme continue sans s'arrêter ?

    Dans ce cas le test sur "!File.Exists(outPath + outFile)" était surement justifié...
    Par contre il faut plutôt faire quelquechose de la sorte pour ne pas prendre tout le processeur :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (!File.Exists(outPath + outFile))
    {
         Thread.Sleep(200);
    }

    Tu peux mettre ça dans ton Thread pour garder la structure actuelle.
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  12. #12
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Oui c'est exactement ça

    Oui c'est vrai qu'avec un sleep ça va me couter moins de ressources... mais je ne suis tout de même pas convaincu de la solution

    Existe t-il des sortes d'écouteurs sur la création d'un fichier?

    merci!

  13. #13
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Vu que ça s'exécute de façon complètement indépendante de ton programme .Net, le seul moyen que je vois c'est de regarder sur l'activité du process PDFCreator en mémoire, mais ce n'est pas plus fiable.

    Cette solution peut paraître "impropre" mais c'est relativement fiable.
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  14. #14
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    N'étant toujours pas convaincu et j'ai continué à chercher... et là!
    Miracle, un truc magique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Console.WriteLine("debut attente");
                System.IO.FileSystemWatcher watcher = new System.IO.FileSystemWatcher(outPath, outFile);
                watcher.WaitForChanged(System.IO.WatcherChangeTypes.Created);
                Console.WriteLine("fin attente");
    Tant que mon fichier n'est pas créé, j'attend avant de sortir de "imprimerPDF(string fichier) "

    Par contre je me dis que je pourrais éventuellement séparer la creation docx et du pdf en passant par un thread pour gagner du temps... non?

  15. #15
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Je me répond à moi même... j'aurais du réfléchir avant de poster... mais je laisse ma réfléxion au cas ou...

    si mon fichier pdf est créé avant de passer par ces nouvelles lignes de code alors le programme va s'arrêter à "watcher.WaitForChanged(System.IO.WatcherChangeTypes.Created);" pour l'éternité...

    d'où
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                if (!File.Exists(Path.Combine(outPath, outFile)))
                {
                    System.IO.FileSystemWatcher watcher = new System.IO.FileSystemWatcher(outPath, outFile);
                    watcher.WaitForChanged(System.IO.WatcherChangeTypes.Created);
                }
    par contre le problème reste entier si par exemple on met un point d'arret juste après le if... mais bon ds la réalité ça n'arrive pas...

    J'attend ton avis Er3van et je passe en mode résolu!

  16. #16
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Effectivement c'est plus propre comme ça, mais ça revient à la même opération : tu attends tant que le fichier n'est pas créé.

    Vérifies juste que ça se déclenche bien quand le processus de génération du PDF est bien fini.
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  17. #17
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Le fichier est créé dans le répertoire quand il a fini d'être généré, donc c'est bon

    Merci

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

Discussions similaires

  1. [D7] Problème d'impression pdf avec PdfCreator
    Par DevLTC dans le forum API, COM et SDKs
    Réponses: 0
    Dernier message: 10/04/2008, 10h27
  2. Pb Creation PDF avec PDFCreator apres impression dans fichier PRN
    Par asimut dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 11/09/2007, 17h46
  3. taille pdf avec pdfcreator
    Par looping dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 29/08/2007, 11h55
  4. Tutorial generation pdf , avec pdf creator
    Par Nicko29 dans le forum VBA Access
    Réponses: 1
    Dernier message: 07/07/2007, 21h12
  5. [VBA-W]Imprimer doc vers pdf avec pdfcreator
    Par Mut dans le forum VBA Word
    Réponses: 2
    Dernier message: 08/12/2006, 14h39

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