2009-01-12 35 views
8

¿Cómo se generan impresiones en papel desde una aplicación web?Impresión desde aplicaciones web

Específicamente, estoy pensando en documentos en papel más complejos como diplomas, facturas y contratos. Número variable de páginas con marcos, tablas, logotipos y encabezados/pies de página.

Hoy uso formularios y CSS personalizados para ciertas cosas e iTextSharp para otros (trabajo con asp.net y MS-SQL), pero creo que ambos enfoques consumen mucho tiempo y son difíciles de hacer consistentes en diferentes documentos.

¿Hay una mejor manera de hacerlo?

Respuesta

3

Crear documentos desde cero con iTextSharp puede llevar mucho tiempo. Como alternativa, puede crear (o reutilizar) documentos de "plantilla" de PDF añadiéndoles campos de formulario (si es necesario). La forma más sencilla de hacerlo es con una versión completa de Adobe Acrobat, pero también puede agregar campos de formulario rellenables usando nada más que iTextSharp.

Por ejemplo, para un premio o diploma, puede encontrar, crear o modificar un PDF que contenga todo el texto, gráficos, bordes elegantes y fuentes para el documento, luego agregue un campo de formulario para el nombre del destinatario. Puede agregar otros campos para fechas, líneas de firma, tipo de premio, etc.

Luego es muy fácil usar iTextSharp desde su aplicación web para completar el formulario, aplanarlo y transmitirlo de nuevo al usuario.

Al final de esta publicación se encuentra un ejemplo del código del controlador ASHX completo.

Recuerde también que iTextSharp (o simplemente iText) también es útil para combinar documentos PDF o páginas de diferentes documentos.Entonces, para un informe anual que tenga un diseño fijo para una página de portada o explicación pero contenido generado dinámicamente, puede abrir la portada, abrir una página de plantilla para el informe, generar el contenido dinámico en un área en blanco de la plantilla, abrir la "página repetitiva" de la página posterior, luego combínelos todos en un solo documento para devolver al usuario.

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

Gracias por la entrada! Ser capaz de usar iTextSharp para "completar" una plantilla en pdf donde todo el diseño complicado se ha hecho en una aplicación adecuada suena perfecto. Si tiene algún código de muestra o un enlace a un recurso que cubra este enfoque, lo agradecería mucho. – Console

3

mi humilde opinión para imprimir PDF formato fijo si la respuesta

2

A pesar de que usted ha declarado que ha intentado un enfoque basado en CSS, el mejor camino a seguir es tomar un vistazo al tipo de medio @print (http://www.w3.org/TR/CSS2/media.html) Básicamente le permite usar una hoja de estilos diferente para imprimir, que para la pantalla o cualquiera de los otros (muchos) tipos de medios.

Entonces, si usted quiere poner en marcha un evento de impresión de forma automática, que desea usar algo como esto (JavaScript):

window.print(); 

Por supuesto, usted tiene que comprobar el navegador realidad admite la impresión a través de JavaScript y actuar en consecuencia:

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

sin embargo, si usted está convencido de que CSS no se adapte a sus necesidades, entonces usted está probablemente va a tener que ir hacia una solución basada en PDF. Sin embargo, no tengo experiencia en la producción de impresiones web 'a' través de PDF.

1

Si está utilizando SQL Server, puede crear un informe utilizando servicios de informes. El usuario puede imprimirlo directamente o exportarlo a diferentes formatos (puede controlar qué formatos están disponibles para el usuario).

He utilizado este enfoque en el pasado y he encontrado que me da mucho más control sobre el aspecto del documento cuando se imprime o se exporta.