2009-01-12 10 views
8

Wie generieren Sie Papierabzüge von einer Webanwendung?Drucken von Webanwendungen

Insbesondere denke ich über komplexere Papierdokumente wie Diplome, Rechnungen und Verträge nach. Variable Anzahl von Seiten mit Rahmen, Tabellen, Logos und Kopf-/Fußzeilen.

Heute verwende ich benutzerdefinierte Formulare und CSS für bestimmte Dinge und iTextSharp für andere (Ich arbeite mit asp.net und MS-SQL), aber ich denke, beide Ansätze sind zeitaufwändig und schwer konsistent über verschiedene Dokumente.

Gibt es einen besseren Weg?

Antwort

3

Das Erstellen von Dokumenten von Grund auf mit iTextSharp kann sehr zeitaufwendig sein. Alternativ können Sie PDF- "Vorlagen" -Dokumente erstellen (oder wiederverwenden), indem Sie ihnen Formularfelder hinzufügen (falls erforderlich). Am einfachsten ist dies mit einer Vollversion von Adobe Acrobat, aber Sie können auch ausfüllbare Formularfelder mit nur iTextSharp hinzufügen.

Beispielsweise können Sie für eine Auszeichnung oder ein Diplom eine PDF-Datei suchen, erstellen oder ändern, die den gesamten Text, Grafiken, Rahmen und Schriftarten für das Dokument enthält, und dann ein Formularfeld für den Namen des Empfängers hinzufügen. Sie können andere Felder für Daten, Unterschriftszeilen, Art der Auszeichnung usw. hinzufügen.

Dann ist es sehr einfach, iTextSharp von Ihrer Webanwendung zu verwenden, um das Formular auszufüllen, es zu reduzieren und es zurück zum Benutzer zu streamen.

Am Ende dieses Beitrags befindet sich ein vollständiges Beispiel für einen ASHX-Handler-Code.

Denken Sie auch daran, dass iTextSharp (oder nur iText) auch zum Kombinieren von PDF-Dokumenten oder Seiten aus verschiedenen Dokumenten nützlich ist.Für einen Jahresbericht, der ein festes Design für eine Deckungs- oder Erläuterungsseite hat, aber dynamisch generierten Inhalt, können Sie das Deckblatt öffnen, eine Vorlagenseite für den Bericht öffnen, den dynamischen Inhalt auf einem leeren Bereich der Vorlage generieren und öffnen die Rückseite "Boilerplate", dann kombinieren Sie sie alle in einem einzigen Dokument, um an den Benutzer zurückzukehren.

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

Danke für die Eingabe! Die Möglichkeit, iTextSharp zu verwenden, um eine PDF-Vorlage zu "vervollständigen", in der das knifflige Layout in einer geeigneten Anwendung ausgeführt wurde, klingt perfekt. Wenn Sie einen Beispielcode oder einen Link zu einer Ressource haben, die diesen Ansatz abdeckt, würde ich dies sehr schätzen. – Console

3

IMHO für festen Formatdruck PDF, wenn die Antwort

2

Auch wenn Sie Ihnen versucht haben, einen CSS-basierten Ansatz angegeben haben, nach vorne der besten Weg, einen Blick auf dem @Print Medientyp zu nehmen ist (http://www.w3.org/TR/CSS2/media.html). Grundsätzlich können Sie ein anderes Stylesheet zum Drucken als für den Bildschirm oder einen der anderen (vielen) Medientypen verwenden.

Dann, wenn Sie automatisch einen Druckvorgang starten möchten, die Sie wollen so etwas wie dieses (JavaScript) verwenden:

window.print(); 

Natürlich werden Sie den Browser tatsächlich unterstützt das Drucken über JavaScript überprüfen müssen gehen zu müssen

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

Wenn jedoch sind Sie darauf, dass CSS Ihre Anforderungen nicht erfüllen, dann sind Sie wahrscheinlich auf eine PDF-basierte Lösung gehen: und entsprechend handeln. Ich habe jedoch keine Erfahrung darin, Webausdrucke über PDF zu erstellen.

1

Wenn Sie SQL Server verwenden, können Sie einen Bericht mithilfe von Berichtsdiensten erstellen. Der Benutzer kann dann entweder direkt drucken oder selbst in verschiedene Formate exportieren (Sie können steuern, welche Formate dem Benutzer zur Verfügung stehen).

Ich habe diesen Ansatz in der Vergangenheit verwendet und ich habe festgestellt, dass es mir viel mehr Kontrolle über das Aussehen des Dokuments gibt, wenn es gedruckt oder exportiert wird.

Verwandte Themen