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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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é .

+ 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