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 :

[Asp net 2008] Savoir si une imprimante est postscript


Sujet :

C#

  1. #1
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut [Asp net 2008] Savoir si une imprimante est postscript
    Bonjour à tous,

    Tout est dans le titre.
    J'aimerais créer un fichier postscript pour le transformer en PDF avec Ghostscript.
    Pour faire ce fichier, je compte m'appuyer sur une imprimante qui, en général, travaille en postscript.
    Seulement, elles ne le font pas toutes.
    J'aurais donc besoin de trouver par code la 1ère de mes imprimante sachant faire du postscript.

    J'ai trouvé ce code qui fait exactement ce que je veux, mais en Delphi.
    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
    function IsPostScriptPrinter(dc : hdc): bool; // Printer.Handle
    var TestInt : integer;
      a : array[0..255] of char;
      err : integer;
      s : string;
    begin
      Result := false;
      TestInt := GETTECHNOLOGY;
      {$IFDEF WIN32}
      if ExtEscape(Dc, QUERYESCSUPPORT, sizeof(TestInt), @TestInt, 0, Nil) > 0 then begin
        Err := ExtEscape(Dc, GETTECHNOLOGY, 0, nil, 256, @a);
      {$ELSE}
      if Escape(Dc, QUERYESCSUPPORT, sizeof(TestInt), @TestInt, Nil) > 0 then begin
        Err := Escape(Dc, GetTechnology, 0, nil, @a);
      {$ENDIF}
        if Err > 0 then begin
          s := UpperCase(StrPas(a));
          if Pos('POSTSCRIPT', s) > 0 then
            result := true;
        end;
      end;
    end;
     
    IsPostScriptPrinter(Printer.Handle)
    Est ce que quelqu'un saurait l'adapter en C# ?

    Merci d'avance.

  2. #2
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Salut.

    Apparemment, via ce qu'on trouve sur le Web, il y aurait moyen d'obtenir cette info via WMI et la classe Win32_Printer : tu récupères la propriété LanguagesSupported[], et si dans les valeurs du trouves ce qui correspond au PostScript (6, voir dans la propriété CurrentLanguage ou DefaultLanguage pour les correspondances uint16), c'est OK .

    Si tu n'en a jamais fait, WMI Code Creator est un excellent outil pour débuter et créer du code facilement .

  3. #3
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Bonjour Max,

    Merci pour cette réponse rapide.
    Ca a l'air extra ce... truc.

    Par contre, en lisant cette doc, c'est plutot "LanguagesSupported" qui contiendrait l'information que je désire ("PS").
    Mais si je fais "Search property values" ou execute code, il me retourne "0 values found...".

    Y a t'il une astuce a faire ?

    David.

  4. #4
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Citation Envoyé par dacid Voir le message
    Par contre, en lisant cette doc, c'est plutot "LanguagesSupported" qui contiendrait l'information que je désire ("PS").
    Si tu lis attentivement mon post, tu verras que c'est ce que j'ai écrit .
    Citation Envoyé par dacid Voir le message
    Mais si je fais "Search property values" ou execute code, il me retourne "0 values found...".

    Y a t'il une astuce a faire ?

    David.
    J'ai eu les mêmes réponses de mon côté, mais je n'ai accès qu'à des imprimantes réseau (et qui ne sont pas que des imprimantes). Je me demande si ça ne vient pas de là... Aurais-tu moyen de tester sur une machine sur laquelle est branchée une imprimante "en direct" genre en USB ?

  5. #5
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Oups, en effet.

    Mes imprimantes sont réseau et je ne peux pas les brancher en direct.
    J'ai d'autres imprimantes installées qui sont virtuelles (acrobat distiller, ...).
    Mais normalement, l'information est dans le driver.

    De plus, le script Delphi donné plus haut arrive bien à extraire l'information. C'est donc possible...

  6. #6
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Citation Envoyé par dacid Voir le message
    Mais normalement, l'information est dans le driver.
    Information intéressante qui m'a fait penser à une piste .

    • 1ère étape : tu fais une requête sur Win32_Printer (en filtrant par exemple sur les imprimantes réseau pour exclure les virtuelles) et tu conserves les couples d'attributs Name et DriverName (par exemple j'obtiens le couple "\\\\XXX\\myPrinterName"-"RICOH Aficio MP C3300 PS"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dictionary<string, string> printerNamesAndDriverNames = new Dictionary<string, string>();
    ManagementObjectSearcher searchResults = new ManagementObjectSearcher("Root\\CIMV2", "SELECT * FROM Win32_Printer WHERE Network=\"true\"");
    foreach (ManagementObject classInstance in searchResults.Get()) {
        printerNamesAndDriverNames.Add((string)classInstance.Properties["Name"].Value, (string)classInstance.Properties["DriverName"].Value);
    }
    • 2ème étape : tu fais une requête sur Win32_PrinterDriver en faisant un WHERE sur l'attribut Name (qui d'après la doc est du type "<Name>,<Version>,<SupportedVersion>", dans mon cas j'obtiens "RICOH Aficio MP C3300 PS,3,Windows NT x86") et un LIKE. À partir de là, il faut identifier si ce driver supporte le PostScript : d'après son nom ça me paraît léger, mais j'ai lu ici qu'un driver PostScript était toujours accompagné d'un fichier PPD, et ça on peut le vérifier avec la propriété DataFile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach (string printerNameKey in printerNamesAndDriverNames.Keys) {
        searchResults = new ManagementObjectSearcher("Root\\CIMV2", string.Format("SELECT * FROM Win32_PrinterDriver WHERE Name LIKE \"{0},%\"", printerNamesAndDriverNames[printerNameKey]));
        foreach (ManagementObject classInstance in searchResults.Get()) {
            if (((string)classInstance.Properties["DataFile"].Value).EndsWith(".PPD", StringComparison.OrdinalIgnoreCase)) {
                Console.WriteLine("{0} supports PostScript", printerNameKey);
            }
        }
    }
    Si j'ai fait ça en deux étapes, c'est parce que j'ai constaté que ça merdait avec des boucles imbriquées , donc je n'ai pas cherché plus loin. Ce serait aussi peut être plus propre de tester l'extension PPD avec un FileInfo ou un truc du genre, mais j'ai eu la flemme. Dis moi si ça fonctionne de ton côté .

  7. #7
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Super !

    Tu sais quoi... T'es un chef !!!

    Moi, les imprimantes virtuelles m'interessent aussi car c'est pour construire un fichier postscript que j'avais besoin de ç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
    15
    16
    17
    18
    19
    20
    21
    namespace WMISample {
        public class MyWMIQuery {
     
            public static void Main() {
            }
     
            public static string getImp() {
                string ret = "";
                try {
                    ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2",
                        "SELECT * FROM Win32_PrinterDriver"); //  WHERE DataFile = 'C:\\WINDOWS\\System32\\spool\\DRIVERS\\W32X86\\3\\EF5X2012.PPD'
                    foreach (ManagementObject queryObj in searcher.Get()) {
                        ret += queryObj["Name"].ToString()+"="+queryObj["DataFile"].ToString() + "<br />";
                    }
                } catch (ManagementException e) {
                    ret = "ERREUR WMI: " + e.Message;
                }
                return ret;
            }
        }
    }
    Maintenant, il me reste à découvrir comment envoyer un fichier HTML transformé par le WebBrowser à une imprimante...

    Merci encore.

  8. #8
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Citation Envoyé par dacid Voir le message
    Maintenant, il me reste à découvrir comment envoyer un fichier HTML transformé par le WebBrowser à une imprimante...

    Merci encore.
    Bah tu peux passer ce topic en résolu, et si besoin en créer un autre pour cette autre question qui n'a rien à voir .

  9. #9
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Aie,

    En fait, je suis en train de voir un pépin.

    Pour voir si une imprimante est postcript, je vais dans PrinterDriver, ok.
    Mais au final, l'info qui m'interesse, c'est le nom utilisé par Windows. Et ce nom est dans Printer et pas dans PrinterDriver.
    J'ai fouillé un peu et je n'ai pas vu d'infos commune sur laquelle j'aurais pu faire un WHERE.

    As tu une astuce ?

  10. #10
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Citation Envoyé par dacid Voir le message
    Aie,

    En fait, je suis en train de voir un pépin.

    Pour voir si une imprimante est postcript, je vais dans PrinterDriver, ok.
    Mais au final, l'info qui m'interesse, c'est le nom utilisé par Windows. Et ce nom est dans Printer et pas dans PrinterDriver.
    J'ai fouillé un peu et je n'ai pas vu d'infos commune sur laquelle j'aurais pu faire un WHERE.

    As tu une astuce ?
    Heu, je ne comprends pas trop ton problème... Dans le code que je t'ai proposé plus haut, j'effectue justement deux requêtes, la première qui récupère les imprimantes dont j'ai besoin (avec notamment le nom Windows que tu cherches), puis la deuxième qui requête les drivers qui correspondent uniquement aux imprimantes sélectionnées juste avant. Hormis une incompréhension de ma part, ça correspond bien à ce que tu recherches (et j'avoue que je ne comprends pas pourquoi dans le code que tu as posté tu ne fais qu'une requête sur les drivers, car justement tu n'as pas le lien avec l'imprimante concernée).

  11. #11
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Oui, j'ai bien vu, mais les "Name" ne correspondent pas... Ils ne renvoient pas la même valeur (malgré la concaténation que tu stipules).

    Je ne trouve pas de clé de frottement.

  12. #12
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Bon, on va faire un test, parce que je n'arrive pas à voir où tu veux en venir . STP exécute ce code tel quel (ne modifie absolument rien), et dis moi ce qui ne va pas entre ce que ça t'affiche et ce que tu souhaites obtenir :
    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
    using System;
    using System.Collections.Generic;
    using System.Management;
     
    namespace PostScriptPrinterTests {
     
        public class Program {
     
            public static void Main(string[] args) {
                performPrinterTests();
                Console.ReadLine();
            }
     
            private static void performPrinterTests() {
                try {
                    Dictionary<string, string> printerNamesAndDriverNames = new Dictionary<string, string>();
                    Dictionary<string, string> ppdPrinters = new Dictionary<string, string>();
                    ManagementObjectSearcher searchResults = new ManagementObjectSearcher("Root\\CIMV2", "SELECT * FROM Win32_Printer");
                    foreach (ManagementObject classInstance in searchResults.Get()) {
                        printerNamesAndDriverNames.Add((string)classInstance.Properties["Name"].Value, (string)classInstance.Properties["DriverName"].Value);
                    }
                    foreach (string printerNameKey in printerNamesAndDriverNames.Keys) {
                        searchResults = new ManagementObjectSearcher("Root\\CIMV2", string.Format("SELECT * FROM Win32_PrinterDriver WHERE Name LIKE \"{0},%\"", printerNamesAndDriverNames[printerNameKey]));
                        foreach (ManagementObject classInstance in searchResults.Get()) {
                            if (((string)classInstance.Properties["DataFile"].Value).EndsWith(".PPD", StringComparison.OrdinalIgnoreCase)) {
                                ppdPrinters.Add(printerNameKey, printerNamesAndDriverNames[printerNameKey]);
                            }
                        }
                    }
                    foreach (string ppdPrinterKey in ppdPrinters.Keys) {
                        Console.WriteLine("\"{0}\" printer (Driver: \"{1}\") is PPD compatible.", ppdPrinterKey, ppdPrinters[ppdPrinterKey]);
                    }
                }
                catch (Exception e) {
                    Console.WriteLine(e.Message);
                }
            }
        }
    }
    J'espère y voir plus clair comme ça .

  13. #13
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Bin mince... C'est ce que je veux.

    En fait, avec ton appli, le name de Printer me renvoie:
    "\\soleil\Canon iR-ADV C5045_PS", "\\SOLEIL\Canon iR3570_Fabrication", ...

    Et le Name de PrinterDriver me renvoie:
    "Canon iR3570/iR4570 PS3,3,Windows NT x86", "Canon iR3235/iR3245 PS3,3,Windows NT x86", ..

    Je me suis arreté là, je ne voyait pas (et ne vois toujours pas) comment il arriverait à faire la jointure...

    J'analyse ton code un peu plus, pour info. Mais merci pour ton investissement.

    [EDIT]Ha, OK, tu utilises le DriverName... Je viens de voir en plus que tu l'avais indiqué plus haut.

    David.

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

Discussions similaires

  1. [WD17] Savoir si une Imprimante est en ligne
    Par davcaz dans le forum WinDev
    Réponses: 3
    Dernier message: 05/07/2013, 12h46
  2. Réponses: 1
    Dernier message: 18/03/2011, 01h52
  3. Réponses: 3
    Dernier message: 11/11/2009, 16h25
  4. Réponses: 2
    Dernier message: 29/06/2006, 16h33
  5. [VB6] [Impression] Savoir si une imprimante est installée
    Par Norm59ttp dans le forum Installation, Déploiement et Sécurité
    Réponses: 2
    Dernier message: 19/12/2002, 09h29

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