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 un PDF côté serveur


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Par défaut Imprimer un PDF côté serveur
    Bonjour à tous,

    Je dois créer un page ASP.NET qui imprime (côté serveur) un document PDF. Ce document PDF se trouve sur le serveur.
    D'après mes recherches, j'ai 2 solutions :
    - soit en important la DLL "shell32.dll" avec la commande "ShellExecuteA".
    - soit en utilisant la librairie "AcroPDFLib" d'Abdobe.
    Ca fait un moment que je potasse la première solution, mais je reste bloqué sur ce message d'erreur :

    Je pense que ceci pourrait être due à l'utilisateur ASPNET qui exécute le code de la page, car celui-ci ne pourrait pas imprimer mon PDF (raison de sécurité?). J'ai déjà changé la base de registre pour m'assurer que l'utilisateur HKEY_USERS\.DEFAULT a bien une imprimante par défaut ; sans résultat.
    Pour la deuxième solution, je ne sais pas s'il faut la version PRO d'adobe reader et si je ne risque pas de rencontrer le même problème!
    Si quelqu'un a un peu d'expérience (ou mieux une solution ) la-dessus, ça me serait d'un grand secours ; toute nouvelle piste sera la bien venue également.

    Code dans la page asp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void PrintTheFile(Object sender, EventArgs e)
    {
    	FilePrinter pf = new FilePrinter("C:\\TestPDF.pdf");
    	pf.Print();	
    }
    Code de la methode appelée:
    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);
     
    public void Print()
    {
    	if (_filename != null)
    		ShellExecuteA(IntPtr.Zero, "print", _filename, null, null, 0);
    }
    Merci d'avance,
    Yo.

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Peux tu poster ton code ? Et peux tu cibler la zone de code qui semble responsable de l'erreur ?
    Ok lorsque j'ai ecrit tu n'avais pas encore modifié ta page.

  3. #3
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Peux tu mettre le code d'appel de cette méthode ?

  4. #4
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Par défaut
    Je viens d'ajouter le code dans le message original, sorry.

    Yo.

  5. #5
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    La méthode print est appellé coté client ou serveur ?
    Que contient _filename lorsque tu appelles print ?

  6. #6
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Par défaut
    La méthode print est appelé côté serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <asp:Button id="btnPrint" text="PRINT FILE" OnClick="PrintTheFile" runat="server" />
    _filename est initialisé dans le constructeur à la valeur : "C:\\TestPDF.pdf"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public FilePrinter(string filename)
    {
    	_filename = filename;
    }
    Pour information, quand je teste mon projet dans Visual Studio, ça fonctionne.

  7. #7
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Par défaut
    Sinon en plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
    using System.Runtime.InteropServices;
    ...
    [DllImport("shell32.dll")]
    private static extern int ShellExecuteA(IntPtr hwnd, string operation, string file, string paramters, string directory, int showcmd);
    ...
    public void PrintTheFile(Object sender, EventArgs e)
    {
            int result = ShellExecuteA(IntPtr.Zero, "print", "C:\\TestPDF.pdf", null, null, 0);
            // result = 42
    }

  8. #8
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Quand est ce qu'apparait l'erreur ? Quand tu cliques sur le bouton de la page asp de l'utilisateur ?

    Essayes de mettre ce code dans une winform. Une fenetre windows avec un seul bouton qui appelle print. -> pour vérifier si tu as la même erreur. Si c'est le cas alors cela viens de l'utilisation de la dll ou de la dll elle même.

  9. #9
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Par défaut
    Le message d'erreur apparait sur le serveur (Windows Server 2003) ; même si je lance la page d'un poste client.

    Je viens de tester dans une "Windows form" ; ça marche nickel :
    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
     
    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            [DllImport("shell32.dll")]
            private static extern int ShellExecuteA(IntPtr hwnd, string operation, string file, string paramters, string directory, int showcmd);
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void btnPrintPdf_Click(object sender, EventArgs e)
            {
                int result = ShellExecuteA(IntPtr.Zero, "print", "C:\\TestPDF.pdf", null, null, 0);
                lblResult.Text = "Result: " + result;
            }
        }
    }
    Sinon je suis tombé sur le poste d'un forum microsoft à propos du même problème:
    http://forums.microsoft.com/MSDN/Sho...29046&SiteID=1
    Est-ce que quelqu'un pourrait m'expliquer ce qu'il entend pour la première option par :
    Try changing the LogonFlag of the CreateProcessWithLogonW method from LOGON_WITH_PROFILE to LOGON_NETCREDENTIALS_ONLY
    ; car je vois pas du tout de quoi il parle ...

  10. #10
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Est-ce que quelqu'un pourrait m'expliquer ce qu'il entend pour la première option par :
    Try changing the LogonFlag of the CreateProcessWithLogonW method from LOGON_WITH_PROFILE to LOGON_NETCREDENTIALS_ONLY
    ; car je vois pas du tout de quoi il parle ...
    Essayes la deuxième option

    A mon avis cela résoudra ton problème.

  11. #11
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Par défaut
    Je viens d'appliquer la deuxième option mais j'ai toujours le problème.
    En fait mon problème ce n'est pas l'impression d'un PDF puisque cela fonctionne dans la "Windows Form" ; mais c'est d'éxécuter un programme sur le serveur à partir de la page ASP du client.
    Est-ce qu'au niveau sécurité c'est envisageable au moins ?

  12. #12
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Je viens d'appliquer la deuxième option mais j'ai toujours le problème.


    La je ne vois pas.
    Je n'ai pas l'impression que ton code soit faux et la dll fonctionne (encore heureux ).
    Je pensais que la dll avait besoin de lancer un truc de type élément graphique pour fonctionner, du moins j'en ai deduit cela avec le lien que tu as fournis.
    En effet de façon général tout programme lancé par un service windows ne peut intérargir avec le bureau que si la case autoriser à interagir avec le bureau est coché dans les propriété du service.
    Mais une ou plusieurs règle(s) de sécurité peut(peuvent) rendre cette option inopérante.

    Bref "La vérite est ailleurs" .
    Mais je ne peut pas t'aider à la trouver. Seul te débrouiller tu dois jeune padawan .
    (Bon ok j'arrête)

  13. #13
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Par défaut
    Bon après 3 jours de dur labeur ... j'ai trouvé le problème. Ca vient du fait que l'utilisateur par défault, s'il n'a pas d'authentifcation, qui essaye d'exécuter ma commande de type "Batch", n'a pas les droits de le faire ; celui-ci est "Network Service" (IIS 6.0, Window Server 2003).
    Pour changer cet utilisateur, il faut :
    * créer un "application pool" sous IIS :
    "IIS Manager" > "Applications Pool" > clique droit > "New" > "Application pool"
    * lui donner l'identité d'un utilisateur qui a les droit d'imprimer :
    "IIS Manager" > "Applications Pool" > votre "application pool > "identity"
    * attacher l'application pool à votre site :
    "IIS Manager" > "Web Sites" > clique droit + propriété pour accéder au propriété de votre site web > "Home directory" > "Application Pool" > sélectionnez l'application pool précédemment créé

    Voici un lien, en anglais, qui explique ça peut-être mieux que moi :
    http://www.eggheadcafe.com/articles/20030703.asp

    A+, Yo.

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

Discussions similaires

  1. imprimer pdf depuis serveur
    Par OSdave dans le forum Documents
    Réponses: 8
    Dernier message: 22/01/2007, 14h11
  2. Imprimer un PDF directement avec PHP
    Par King_T dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 11/05/2006, 01h02
  3. Imprimer un PDF en javascript
    Par shoushinye dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/10/2005, 09h48
  4. VBA/Word/Excel97/Imprimer un pdf sans ouvrir acrobat
    Par ouskel'n'or dans le forum VBA Word
    Réponses: 2
    Dernier message: 28/09/2005, 21h40
  5. [PDF] Imprimer un pdf
    Par Magguy dans le forum Documents
    Réponses: 3
    Dernier message: 21/01/2005, 09h08

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