2009-01-12 19 views
8

Comment générer des impressions papier à partir d'une application Web? En particulier, je pense à des documents papier plus complexes comme les diplômes, les factures et les contrats. Nombre variable de pages avec des cadres, des tableaux, des logos et des en-têtes/pieds de page. Aujourd'hui, j'utilise des formulaires personnalisés et CSS pour certaines choses et iTextSharp pour d'autres (je travaille avec asp.net et MS-SQL), mais je pense que les deux approches sont chronophages et difficile à rendre cohérent à travers différents documents.Impression à partir d'applications Web

Y a-t-il une meilleure façon de s'y prendre?

Répondre

3

Créer des documents à partir de zéro avec iTextSharp peut prendre beaucoup de temps. Vous pouvez également créer (ou réutiliser) des documents PDF "modèle" en leur ajoutant des champs de formulaire (si nécessaire). La méthode la plus simple consiste à utiliser une version complète d'Adobe Acrobat, mais vous pouvez également ajouter des champs de formulaire remplissables en utilisant uniquement iTextSharp. Par exemple, pour un prix ou un diplôme, vous trouvez, créez ou modifiez un PDF contenant tout le texte, les graphiques, les bordures de fantaisie et les polices du document, puis ajoutez un champ de formulaire pour le nom du destinataire. Vous pouvez ajouter d'autres champs pour les dates, les lignes de signature, le type de récompense, etc.

Ensuite, il est très facile d'utiliser iTextSharp depuis votre application Web pour remplir le formulaire, l'aplatir et le retransmettre à l'utilisateur.

À la fin de ce post est un exemple complet de code de gestionnaire ASHX.

Rappelez-vous également que iTextSharp (ou simplement iText) est également utile pour combiner des documents PDF ou des pages provenant de différents documents.Ainsi, pour un rapport annuel qui a un design fixe pour une page de couverture ou d'explication mais du contenu généré dynamiquement, vous pouvez ouvrir la page de couverture, ouvrir une page de modèle pour le rapport, générer le contenu dynamique sur une zone vide du modèle, ouvrir la page arrière "passe-partout", puis les combiner tous en un seul document pour revenir à l'utilisateur.

using System; 
using System.Data; 
using System.Web; 
using System.Collections; 
using System.Web.Services; 
using System.Web.Services.Protocols; 
using System.Text; 
using iTextSharp; 
using iTextSharp.text; 
using iTextSharp.text.pdf; 

namespace iTextFormFillerDemo 
{ 
    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    public class DemoForm : IHttpHandler 
    { 

     public void ProcessRequest(HttpContext context) 
     { 

      context.Response.ContentType = "application/pdf"; 
      //This line will force the user to either open or save the 
      //file instead of it appearing on its own page - if you remove it, 
      //the page will appear in the browser in the same window. 
      context.Response.AddHeader("Content-Disposition", 
       "attachment; filename=DemoForm_Filled.pdf"); 

      FillForm(context.Response.OutputStream); 

      context.Response.End(); 
     } 

     // Fills the form and pushes it out the output stream. 
     private void FillForm(System.IO.Stream outputStream) 
     { 
      //Need to get the proper directory (dynamic path) for this file. 
      //This is a filesystem reference, not a web/URL reference... 
      //The PDF reader reads in the fillable form 
      PdfReader reader = new PdfReader("C:/DemoForm_Fillable.pdf"); 

      //The PDF stamper creates an editable working copy of the form from the reader 
      //and associates it with the response output stream 
      PdfStamper stamper = new PdfStamper(reader, outputStream); 

      //The PDF has a single "form" consisting of AcroFields 
      //Note that this is shorthand for writing out 
      //stamper.AcroFields.SetField(...) for each set 
      AcroFields form = stamper.AcroFields; 

      //Set each of the text fields this way: SetField(name, value) 
      form.SetField("txtFieldName", "Field Value"); 
      form.SetField("txtAnotherFieldName", "AnotherField Value"); 

      //Set the radio button fields using the names and string values: 
      form.SetField("rbRadioButtons", "Yes"); //or "No" 

      //Form flattening makes the form non-editable and saveable with the 
      //form data filled in 
      stamper.FormFlattening = true; 

      //Closing the stamper flushes it out the output stream 
      stamper.Close(); 

      //We're done reading the file 
      reader.Close(); 
     } 

     public bool IsReusable 
     { 
      get 
      { 
       return false; 
      } 
     } 
    } 
} 
+0

Merci pour l'entrée! Etre capable d'utiliser iTextSharp pour "compléter" un modèle pdf où toute la mise en page délicate a été faite dans une application appropriée semble parfait. Si vous avez un exemple de code ou un lien vers une ressource qui couvre cette approche, je l'apprécierais beaucoup. – Console

3

à mon humble avis pour l'impression PDF format fixe si la réponse

2

Même si vous avez dit que vous avez essayé une approche basée sur CSS, la meilleure façon est avant de jeter un oeil au type de support @print (http://www.w3.org/TR/CSS2/media.html). Fondamentalement, vous permet d'utiliser une feuille de style différente pour l'impression, que pour l'écran, ou l'un des autres types de médias (nombreux).

Ensuite, si vous voulez lancer un événement d'impression automatiquement, vous voulez utiliser quelque chose comme ça (JavaScript):

window.print(); 

Bien sûr, vous devrez vérifier le navigateur prend en charge réellement l'impression via JavaScript , et agir en conséquence:

function doPrint() { 
    if(!window.print()) 
    { 
     alert("Your browser does not support direct printing, please select 'Print' from the 'File' menu."); 
    } 
} 

Si, cependant, vous êtes catégorique que CSS ne répondra pas à vos besoins, vous allez probablement avoir besoin d'aller vers une solution PDF. Cependant, je n'ai aucune expérience de la production de pages imprimées via PDF.

1

Si vous utilisez SQL Server, vous pouvez créer un rapport à l'aide de services de génération de rapports. L'utilisateur peut alors imprimer directement ou exporter lui-même un certain nombre de formats différents (vous pouvez contrôler quels formats sont disponibles pour l'utilisateur).

J'ai utilisé cette approche dans le passé et j'ai constaté qu'elle me donne beaucoup plus de contrôle sur l'aspect du document lorsqu'il est imprimé ou exporté.