Nous entendons souvent des programmeurs VB.NET ou C# le désir de pouvoir créer des documents PDF à partir d'applications ASP.NET. Ce guide vous montre comment procéder.

Lorsque vous travaillez avec ASP.NET sous IIS, il est souvent difficile de traiter correctement le sujet de la sécurité. C'est également un problème important si vous souhaitez imprimer un PDF et le transférer à l'utilisateur. J'espère que les éléments suivants vous aideront à surmonter ces défis et à vous mettre sur la bonne voie avec une bonne solution PDF pour votre application ASP.NET.

À la fin de cette page, vous trouverez un lien vers le code source qui peut être utilisé pour créer cet exemple.

Que fait l'exemple?

L'exemple est un gestionnaire ASP.NET qui crée un document PDF et le transmet au visiteur du site Web. Le code PDF peut être stocké dans un formulaire ASP.NET normal ainsi que dans ce gestionnaire.

Imprimer à partir d'ASP.NET à l'aide de la classe PrintDocument

Cet exemple se concentre sur l'impression C# à l'aide de la classe PrintDocument et du PrintPageEventHandler. Il s'agit de la manière typique par laquelle ils intègrent la fonctionnalité d'impression dans leur application Microsoft.NET. Bien que l'exemple soit écrit en C#, les principes doivent également s'appliquer à VB.NET ou à d'autres langages compatibles .NET.

Les défis

Si nous voulons imprimer un PDF à partir d'ASP.NET, nous sommes confrontés à certains défis. Le premier est la sécurité autour d'IIS et le second est la parallélisation.

Pression et sécurité

Dans une installation IIS normale, le contexte utilisateur se limite à fournir des fichiers et à exécuter des scripts. Cet exemple a été créé pour s'exécuter avec des paramètres de sécurité standard. Cela signifie que vous n'avez pas à étendre les autorisations existantes pour l'utilisateur IIS pour que cela fonctionne. Cela pourrait poser un risque pour la sécurité de votre serveur, et nous ne le voulons vraiment pas.

Habituellement, l'imprimante PDF utilise le contexte de l'utilisateur d'impression pour créer le PDF. Ceci est très utile si vous l'utilisez sur un ordinateur de bureau ou un serveur Terminal Server. Même si vous l'utilisez à partir d'un service normal, il peut être avantageux d'effectuer la conversion dans le contexte de l'utilisateur du service. Si vous regardez IIS, cependant, le contexte utilisateur est trop verrouillé. Vos visiteurs du site Web peuvent être anonymes et nous ne pouvons donc pas compter sur le contexte de sécurité normal.

Heureusement, l'imprimante PDF peut être configurée pour s'exécuter dans le contexte de sécurité du service Spouleur d'impression. Ce service utilise généralement le compte système pour se connecter. Le compte système a accès à la plupart des ressources locales, par ex. B. disques durs locaux. Afin de configurer l'imprimante pour qu'elle s'exécute dans le contexte du spouleur, certains paramètres de registre doivent être définis. Au lieu d'avoir à le faire manuellement, le programme d'installation de l'imprimante dispose d'un commutateur de ligne de commande qui lui demande d'installer une imprimante et de la préparer pour une utilisation avec IIS.

Impression et parallélisation

Lorsqu'un utilisateur visite son site Web et souhaite recevoir un document PDF, il démarre un processus qui crée le document demandé. Un autre utilisateur pourrait venir sur son site Web et demander un autre PDF pendant que le premier est en cours de production.

En règle générale, l'imprimante est contrôlée en créant un fichier de configuration runonce.ini. Ce fichier définit les paramètres de création du prochain travail d'impression PDF. Ce comportement ne peut plus être utilisé pour les utilisateurs simultanés, car un runonce.ini peut remplacer un autre qui n'a pas encore été traité par l'imprimante. Par conséquent, nous devons utiliser une fonction dans l'imprimante PDF avec laquelle nous pouvons dire à l'imprimante exactement quelle configuration runonce doit être utilisée pour un travail d'impression spécifique.

Exécutez l'exemple

Comment installer l'imprimante et configurer l'application ASP.NET.

Installer l'imprimante PDF

Pour exécuter cet exemple, vous devez d'abord installer l'imprimante PDF et la préparer pour une utilisation avec IIS. N'oubliez pas que vous devez utiliser la version 10.8 et au moins Professional Edition ou supérieure pour que cela fonctionne. Même si vous avez déjà installé l'imprimante, nous vous recommandons d'installer cette nouvelle instance de l'imprimante et de la configurer spécifiquement pour une utilisation avec IIS. Pour effectuer ces tâches, exécutez simplement la ligne de commande suivante dans un dossier qui contient le programme d'installation de l'imprimante:

Setup_7PDF_10_8_0_2277_PRO.exe /SPOOLERCONTEXT /SILENT /PRINTERNAME="IIS PDF Printer"

Cela permettra de déterminer les entrées de registre correctes et de créer une structure de dossiers pour les fichiers liés à la création de PDF. Par défaut, ces fichiers et dossiers sont créés ici:

C:\ProgramData\PDF Writer\IIS PDF Printer

Générez l'application ASP.NET

Vous devez télécharger les fichiers d'exemple et enregistrer le dossier en tant qu'application IIS qui prend en charge ASP.NET. N'oubliez pas de rendre le dossier APP_DATA accessible en écriture pour l'utilisateur de l'application APS.NET.

Une fois l'application créée et l'imprimante installée, vous pouvez accéder à Default.aspx et essayer l'exemple.

Le code source

Vous pouvez télécharger le code source de cet exemple dans le fichier ZIP suivant ou vous inspirer de la liste des codes source.

    <%@ WebHandler Language="C#" Class="Print" %>
    using System;
    using System.Web;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Drawing.Printing;
    using System.IO;
    using System.Linq;
    using pdf7.PdfWriter;
    public class Print : IHttpHandler
    {
    public void ProcessRequest(HttpContext context)
    {
    string printerName = "IIS PDF Printer";
    string downloadName = "aspnet test.pdf";
    string jobId = Guid.NewGuid().ToString();
    string jobName = string.Format("ASP.NET-{0}", jobId);
    string tempPath = Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data"),
    "Temp");
    string jobTempPath = Path.Combine(tempPath, jobId);
    string pdfName = string.Format("ASP.NET-{0}.pdf", jobId);
    string pdfPath = Path.Combine(jobTempPath, pdfName);
    string statusFile = Path.Combine(jobTempPath, "status.ini");
    // Create folders
    Directory.CreateDirectory(jobTempPath);
    // Set parameters for print job
    PdfSettings pdfSettings = new PdfSettings();
    pdfSettings.PrinterName = printerName;
    // These settings will only have effect if they are not overwritten by values in 
    // the global.ini
    pdfSettings.SetValue("Output", pdfPath);
    pdfSettings.SetValue("StatusFile", statusFile);
    pdfSettings.SetValue("ShowSettings", "never");
    pdfSettings.SetValue("ShowSaveAS", "never");
    pdfSettings.SetValue("ShowProgress", "no");
    pdfSettings.SetValue("ShowProgressFinished", "no");
    pdfSettings.SetValue("ShowPDF", "no");
    pdfSettings.SetValue("ConfirmOverwrite", "no");
    pdfSettings.SetValue("RememberLastFolderName", "no");
    pdfSettings.SetValue("RememberLastFileName", "no");
    pdfSettings.SetValue("WatermarkLayer", "bottom");
    pdfSettings.SetValue("WatermarkText", "Test from ASP.NET");
    // Create a runonce.ini that is specific to this job
    // https://www.7-pdf.com/products/pdf-printer/documentation/settings
    string defaultRunoncePath =
    pdfSettings.GetSettingsFilePath(PdfSettingsFileType.RunOnce);
    string specificRunoncePath = Path.Combine(
    Path.GetDirectoryName(defaultRunoncePath),
    string.Format("runonce_{0}.ini", Uri.EscapeDataString(jobName)));
    pdfSettings.WriteSettings(specificRunoncePath);
    // Create print job
    PrintDocument pd = new PrintDocument();
    pd.DocumentName = jobName;
    pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
    pd.PrinterSettings.PrinterName = printerName;
    pd.DefaultPageSettings.Landscape = false;
    pd.DefaultPageSettings.PaperSize = new PaperSize("Letter", 850, 1100);
    pd.Print();
    // Wait for PDF creation to finish
    if (PdfUtil.WaitForFile(statusFile, 20000))
    {
    // Read error information from status file
    string errorValue = PdfUtil.ReadIniString(statusFile, "Status", "Errors",
    "");
    if (errorValue == "0")
    {
    // Stream PDF to browser
    context.Response.ClearContent();
    context.Response.ContentType = "Application/pdf";
    context.Response.AddHeader("Content-Disposition",
    "inline; filename=" + downloadName);
    context.Response.WriteFile(pdfPath);
    context.Response.Flush();
    // Remove files after the PDF is streamed to the client browser
    File.Delete(pdfPath);
    File.Delete(statusFile);
    Directory.Delete(jobTempPath);
    context.Response.End();
    return;
    }
    else
    {
    string errorMessage = PdfUtil.ReadIniString(statusFile, "Status",
    "MessageText", "");
    WriteErrorMessage(string.Format("An error was reported: {0}; {1}",
    errorValue, errorMessage));
    }
    }
    WriteErrorMessage("No PDF was created.");
    }
    private void WriteErrorMessage(string message)
    {
    HttpContext.Current.Response.ContentType = "text/plain";
    HttpContext.Current.Response.Write(message);
    }
    private void pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
    // Output something in the print
    SolidBrush myBrush = new SolidBrush(Color.Blue);
    Font font = new Font("Arial", 12);
    e.Graphics.DrawString("Print test: " + DateTime.Now.ToString(),
    font, myBrush, e.MarginBounds.Left, e.MarginBounds.Top);
    myBrush.Dispose();
    }
    public bool IsReusable
    {
    get
    {
    return false;
    }
    }
    }
    

Dépannage

Si vous n'avez pas défini l'accès en écriture pour l'utilisateur IIS ou les utilisateurs en général dans le dossier APP_DATA, une erreur similaire à celle-ci s'affiche, telle que: Access to the path 'C:\inetpub\Print From Handler\App_Data\Temp\b2c27634-1ee5-4afc-a4da-0f93c7b2452f' is denied.

Vous pouvez télécharger et exécuter l'exemple vous-même. Les fichiers requis sont disponibles ici.

Téléchargements

appendice taille
Télécharger l'exemple de code 8.7 KB

Top