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# Discussion :

Imprimer via process


Sujet :

C#

  1. #1
    Membre confirmé Avatar de bobjoumi
    Profil pro
    Inscrit en
    Février 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 94
    Par défaut Imprimer via process
    Bonjour je dois imprimer des documents PDF a partir de mon application.
    pour cela j'utilise cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [DllImport("shell32.dll")]
    private static extern int ShellExecuteA(IntPtr hwnd, string operation, string file, string paramters, string directory, int showcmd);
     
    private void Print()
    {
         if (_filename != null)
         { ShellExecuteA(IntPtr.Zero, "print", _filename, null, null, 0); }
    }
    A partir de la, aucun problème, il ouvre brièvement adobe et lance l'impression dans la foulé.

    Seulement il ne me demande pas l'imprimante et lance sur celle par défaut.
    Alors pour détourné cela je change l'imprimante par défaut juste avant ce cette manière :

    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
     
    [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool SetDefaultPrinter(string Name);
     
    public static void change(string printer)
    {
         SetDefaultPrinter(printer);
    }
     
    if (printDlg.ShowDialog() == DialogResult.OK)
    {
        change(printDlg.PrinterSettings.PrinterName);
    //////////////////////////
        Print();
    //////////////////////////
    }
    Avant sa je récupère l'imprimante par défaut actuel pour la remétre après mon traitement.

    De cette façon je permet a l'utilisateur de choisir son imprimante, mais le problème est le suivant :
    Quand je laisse l'imprimante par défaut, pas de problème !
    Quand je choisie une autre imprimante, il continue a imprimé sur la dernière?!?!
    Pourtant l'imprimante par défaut change bien
    En recommencent un nombre aléatoire de fois l'impression se fait bien sur celle que je veux. Après je veux retenter sur celle par défaut et il imprime sur la dernière malgrés que se soit pas celle par defaut

    je me suis aperçus d'une chose en mode debug : l'impression ne s'exécute pas juste après "Print();" mais une ou deux ligne après...

    pouvez vous m'aider svp? je ne comprend vraiment pas!
    merci d'avance

  2. #2
    Membre confirmé

    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Par défaut
    Je m'avance peut-être, mais c'est probablement une question de thread. Ton impression est lancé mais ton application se poursuit quand même. Il faudrait peut-être regarder à synchroniser tout sa !

  3. #3
    Membre confirmé Avatar de bobjoumi
    Profil pro
    Inscrit en
    Février 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 94
    Par défaut
    Mon application est un moteur d'impression, je vais dans une bdd pour avoir une liste de document a imprimer et je les imprime un a un en bouclant sur un dataset. pour évité qu'un document écrase l'autre j'utilise les thread de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            public void Print_Simple()
            {
                Thread tache = new Thread(Print);
                tache.Start();
            }
    si je ne fais pas sa, mon application beug méchamment quand arrive le tour du second document.

  4. #4
    Membre confirmé Avatar de bobjoumi
    Profil pro
    Inscrit en
    Février 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 94
    Par défaut
    Bon! je n'est pas encore trouvé de solution pour le problème initial par contre je me permet de remonter le sujet pour vous faire part d'un problème parallèle.

    Aujourd'hui je n'affiche plus de PrintDialog mais j'en est codée un moi même :



    Je récupère la liste des imprimantes, leur états et je peu afficher leur configuration avec le bouton "Propriétés" :



    En validant les paramètres j'arrive a récupéré le nombre de copies et à m'en servir dans une simple boucle pour mon moteur d'impression.

    Cependant quand je modifie le paramètre Duplex pour le recto/verso, j'arrive à récupéré ce paramètre, mais quand je lance l'impression elle se fait en simplex et et je ne vois pas comment utiliser ce paramètre pour que sa fonctionne.

    Merci de votre aides.

  5. #5
    Membre confirmé Avatar de bobjoumi
    Profil pro
    Inscrit en
    Février 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 94
    Par défaut Incertitude
    Je ne sais pas si ce que je demande est trot compliqué ou au contraire tellement simple que personne ne se donne la peine de répondre...
    J'espère que la cause est plutôt le manque d'explication de ma part

    Néanmoins, je reste complétement perdu est un simple indice serait le bienvenue.

    Si quelqu'un a une idée pouvez vous me dire si dans le code suivant, je peut specifier recto/verso?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private void Print()
    {
         if (_filename != null)
         { ShellExecuteA(IntPtr.Zero, "print", _filename, null, null, 0); }
    }

  6. #6
    Membre averti
    Inscrit en
    Août 2006
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 56
    Par défaut
    bonjour

    essaye avec des objets PrintDocument

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 82
    Par défaut
    Voilà un code qui fonctionne. Adobe s'ouvre et se referme après 3 secondes.
    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
     
    String RepertoireBase= "c:\\";
    String Imprimante11X17 = "HP 11X17";
    String Imprimante8X11 = "HP 8X11";
    System.IO.DirectoryInfo dinfo = new System.IO.DirectoryInfo(RepertoireBase);
                foreach (System.IO.FileInfo fichier in dinfo.GetFiles())
                {
                    if (fichier.Extension.ToUpper() == ".PDF")
                    {
    try
                        {
                            if (fichier.Name.ToUpper().IndexOf("11X17") > -1)
                            {
                                setImprimanteParDefautPDF(Imprimante11X17);
                            }
                            else
                            {
                                setImprimanteParDefautPDF(Imprimante8X11);
                            }
                            System.Diagnostics.Process proc = new System.Diagnostics.Process();
                            proc.EnableRaisingEvents = false;
     
                            proc.StartInfo.FileName = fichier.FullName;
                            proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                            proc.StartInfo.Verb = "PrintTo";
                            // /h pour hide mode
                            proc.StartInfo.CreateNoWindow = true;
                            proc.Start();
                            proc.WaitForExit(3000);
                            try
                            {
                                proc.CloseMainWindow();
                                proc.Close();
                            }
                            catch (System.Exception ex2)
                            { }
                        }
                        catch (System.Exception ex)
                        {
                            MessageBox.Show(fichier.Name + " " + ex, "Erreur d'impression", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
        }
    }
    De mon côté, je n'étais pas capable d'imprimer un fichier pdf sur du papier 11X17 en changeant pour le format Tabloid, j'ai donc créé une seconde imprimante avec le plateau 11X17 par défaut.

    À ce que j'ai vu sur le net c'est assez compliqué dans changer les paramètres par défaut d'une imprimante en c# sans un logiciel appart.

    Tu pourrais aussi au lieu de 3 secondes faire une boucle jusqu'à ce que ton impression précédente soit terminée. J'utilise cette technique pour créer mes pdf avec PDFCreator sinon tous mes fichiers ont le même nom.

    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
     
     public void BouclePDFCreator()
            {
                if (impPDF == true)
                {
                    while (PrintEventDetectedHandler())
                    {
                        //ON BOUCLE TANT QUE LES IMPRESSION EN PDF NE SONT PAS TERMINÉS
                        Application.DoEvents();
                    }
                }
            }
            public Boolean PrintEventDetectedHandler()
            {
                StringCollection printJobCollection = new StringCollection();
                //foreach (System.Management.PropertyData printJobData in e.NewEvent.Properties)
                //{
                string searchQuery = "SELECT * FROM Win32_PrintJob";
     
                System.Management.ManagementObjectSearcher searchPrintJobs = new System.Management.ManagementObjectSearcher(searchQuery);
                System.Management.ManagementObjectCollection prntJobCollection = searchPrintJobs.Get();
                foreach (System.Management.ManagementObject prntJob in prntJobCollection)
                {
                    // For each event, capture the relevant data and send it to be formatted and entered into the 
                    // database.
     
                    // Grabs job name and job ID for the current print job.
                    // Job name is formatted as follows: [Printer Name], [Job ID] and so needs the the two fields 
                    // to be separated.  
                    String jobName = prntJob.Properties["Name"].Value.ToString();
                    char[] splitArr = new char[1];
                    splitArr[0] = Convert.ToChar(",");
                    string printerName = jobName.Split(splitArr)[0];
                    string printJobId = jobName.Split(splitArr)[1];
     
                    // Grabs the document name
                    string documentName = prntJob.Properties["Document"].Value.ToString();
     
                    // Grabs the current printer operation (Such as spooling, printing etc)
                    string printJobOperation = prntJob.Properties["JobStatus"].Value.ToString();
     
                    // Grabs the number of pages actually printed. 
                    // TODO: Seems inacurate (answer is always 0) so needs checking
                    string printJobPagesPrinted = prntJob.Properties["PagesPrinted"].Value.ToString();
     
                    // Grabs the current status of the print job (errors etc)
                    string printStatus = prntJob.Properties["Status"].Value.ToString();
     
                    // Grabs the current status code of the print job. 
                    // TODO: Seems to be the same status as JobStatus above. Look into and decide which to use. 
                    string printStatusMask = prntJob.Properties["StatusMask"].Value.ToString();
     
                    if (printerName.ToUpper() == NomImprimantePDF)
                    {
                        return true;
                    }
                    //MessageBox.Show(" Printername: " + printerName + "\nDocumentname: " + documentName + "\nJob ID: " + printJobId +
                    //    "\nCurrent printer operation: " + printJobOperation + "\nPages printed: " + printJobPagesPrinted +
                    //    "\nPrint status: " + printStatus + "\nPrint status code: " + printStatusMask);
     
                    //}
                }
                return false;
            }
    J'espère que ces lignes de codes pourront t'aider.
    Bonne chance.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 82
    Par défaut
    Cependant quand je modifie le paramètre Duplex pour le recto/verso, j'arrive à récupéré ce paramètre, mais quand je lance l'impression elle se fait en simplex et et je ne vois pas comment utiliser ce paramètre pour que sa fonctionne.
    J'ai eu ce problème, la fenêtre propriété est seulement là pour le document que tu as présentement d'ouvert. Tu modifies les infos et au prochain document tout redevient par défaut.

    C'est pour ça que je te conseille mon truc
    Avoir plusieurs drivers d'imprimante
    Brother 5250 duplex
    Brother 5250 simple
    etc.

    Et dans ton code tu changes ton imprimante par défaut. Avant chaque impression. Mais tu dois t'assurer que Adobe a bien lancé l'impression précédente d'où le délai de 3 secondes ou la boucle pour valider que l'impression est bien terminé.


    lonycc
    PrintDocument
    Si tu réussis à imprimer avec PrintDocument un PDF j'aimerais avoir le code.

  9. #9
    Membre confirmé Avatar de bobjoumi
    Profil pro
    Inscrit en
    Février 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 94
    Par défaut
    Citation Envoyé par lonycc Voir le message
    bonjour

    essaye avec des objets PrintDocument
    je serais très heureux d'avoir le code aussi


    Merci pour tes réponses girouxv, je vais surement faire comme tu me dis pour le recto/verso, utiliser deux imprimantes une en Duplex et l'autre en Simplex.

    je vais tenter ta méthode PrintEventDetectedHandler() j'espère que ça règlera mon problème principal. Car si j'imprime un premier lot en simplex et un second en Duplex faut pas que sa imprime sur la mauvaise imprimante...

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 82
    Par défaut
    J'ai amélioré mon code je ne sais pas si ça peut t'être utile. Je ne mets plus l'imprimante par défaut, on peut spécifier le nom de l'imprimante dans les paramètres et j'ai aussi ajouter un proc.Kill(); après 10 secondes car adobe ne se fermait pas toujours.
    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
     
     try
                        {
                            if (fichier.Name.ToUpper().IndexOf("11X17") > -1)
                            {
                                strImprimante = Imprimante11X17;
                                //setImprimanteParDefautPDF(Imprimante11X17);
                            }
                            else
                            {
                                strImprimante=Imprimante8X11;
                                //setImprimanteParDefautPDF(Imprimante8X11);
                            }
     
                            Delai = 10;
                            System.Diagnostics.Process proc = new System.Diagnostics.Process();
                            proc.EnableRaisingEvents = false;
     
                            proc.StartInfo.FileName = fichier.FullName;
                            proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                            proc.StartInfo.Verb = "PrintTo";
                            proc.StartInfo.Arguments = "\"" + strImprimante + "\"";
                            proc.StartInfo.CreateNoWindow = true;
                            proc.Start();                        
                            //proc.WaitForExit(3000);
                            while (Delai > 0)
                            {
                                System.Threading.Thread.Sleep(1000);
                                Delai -= 1;
                            }
                            proc.Kill();
     
                            proc.Dispose();
                            Application.DoEvents();
                         }
                        catch (System.Exception ex)
                        {
                            MessageBox.Show(fichier.Name + " " + ex, "Impression", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }

  11. #11
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Utilisant le même genre de code que girouxv, j'ai une question sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc.StartInfo.Arguments = "\"" + strImprimante + "\"";
    Est-il necessaire de mettre le nom d'imprimante entre double quotes ?

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 82
    Par défaut
    Je crois que oui si ton nom a des espace par exemple hp 1060
    Mais j'avoue je n'ai pas testé.

  13. #13
    Membre confirmé Avatar de bobjoumi
    Profil pro
    Inscrit en
    Février 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 94
    Par défaut
    Citation Envoyé par girouxv Voir le message
    J'ai amélioré mon code je ne sais pas si ça peut t'être utile. Je ne mets plus l'imprimante par défaut, on peut spécifier le nom de l'imprimante dans les paramètres et j'ai aussi ajouter un proc.Kill(); après 10 secondes car adobe ne se fermait pas toujours.
    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
     
     try
                        {
                            if (fichier.Name.ToUpper().IndexOf("11X17") > -1)
                            {
                                strImprimante = Imprimante11X17;
                                //setImprimanteParDefautPDF(Imprimante11X17);
                            }
                            else
                            {
                                strImprimante=Imprimante8X11;
                                //setImprimanteParDefautPDF(Imprimante8X11);
                            }
     
                            Delai = 10;
                            System.Diagnostics.Process proc = new System.Diagnostics.Process();
                            proc.EnableRaisingEvents = false;
     
                            proc.StartInfo.FileName = fichier.FullName;
                            proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                            proc.StartInfo.Verb = "PrintTo";
                            proc.StartInfo.Arguments = "\"" + strImprimante + "\"";
                            proc.StartInfo.CreateNoWindow = true;
                            proc.Start();                        
                            //proc.WaitForExit(3000);
                            while (Delai > 0)
                            {
                                System.Threading.Thread.Sleep(1000);
                                Delai -= 1;
                            }
                            proc.Kill();
     
                            proc.Dispose();
                            Application.DoEvents();
                         }
                        catch (System.Exception ex)
                        {
                            MessageBox.Show(fichier.Name + " " + ex, "Impression", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
    Si cela m'évite de changé d'imprimante par défaut, je crois que ce code est génial je le test ce matin et je te tiens au courant merci beaucoup!

  14. #14
    Membre confirmé Avatar de bobjoumi
    Profil pro
    Inscrit en
    Février 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 94
    Par défaut Enfin!
    Formidable ça fonctionne! j'arrive a imprimer d'une imprimante à une autre sans problème par contre pour le recto/verso j'utilise deux imprimantes mais c'est encore mieux pour ce que j'ai besoin.
    Merci girouxv et lonycc


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

Discussions similaires

  1. imprimer via le spool windows ?
    Par rimas2009 dans le forum Documents
    Réponses: 3
    Dernier message: 30/07/2009, 18h42
  2. Commande LPR via Process
    Par plutonium719 dans le forum Langage
    Réponses: 1
    Dernier message: 16/03/2009, 16h59
  3. Imprimer via Cups ?
    Par clampin dans le forum C
    Réponses: 5
    Dernier message: 18/08/2008, 16h55
  4. Aperçu d'un document avant de l'imprimer via PHP
    Par c moi dans le forum Langage
    Réponses: 4
    Dernier message: 12/07/2007, 00h05

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