Печать из веб-приложений - PullRequest
8 голосов
/ 12 января 2009

Как вы генерируете бумажные отпечатки из веб-приложения?

В частности, я имею в виду более сложные бумажные документы, такие как дипломы, счета и контракты. Переменное количество страниц с фреймами, таблицами, логотипами и колонтитулами.

Сегодня я использую собственные формы и CSS для некоторых вещей и iTextSharp для других (я работаю с asp.net и MS-SQL), но я думаю, что оба подхода трудоемки и их трудно согласовать в разных документах. *

Есть ли лучший способ сделать это?

Ответы [ 4 ]

3 голосов
/ 22 января 2009

Создание документов с нуля с помощью iTextSharp может занять очень много времени. В качестве альтернативы, вы можете создавать (или повторно использовать) документы «шаблона» PDF, добавляя к ним поля формы (при необходимости). Самый простой способ сделать это - использовать полную версию Adobe Acrobat, но вы также можете добавить заполняемые поля формы, используя только iTextSharp.

Например, для награды или диплома вы находите, создаете или изменяете PDF-файл, содержащий весь текст, графику, необычные границы и шрифты для документа, а затем добавляете поле формы для имени получателя. Вы можете добавить другие поля для дат, линий подписи, типа вознаграждения и т. Д.

Тогда очень просто использовать iTextSharp из вашего веб-приложения, чтобы заполнить форму, выровнять ее и отправить обратно пользователю.

В конце этого поста приведен полный пример кода обработчика ASHX.

Также помните, что iTextSharp (или просто iText) также полезен для объединения документов PDF или страниц из разных документов. Таким образом, для годового отчета, который имеет фиксированный дизайн обложки или страницы объяснения, но динамически генерируемый контент, вы можете открыть титульную страницу, открыть страницу шаблона для отчета, сгенерировать динамический контент в пустой области шаблона, открыть на задней странице «шаблон», затем объедините их в единый документ для возврата пользователю.

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;
            }
        }
    }
}
3 голосов
/ 12 января 2009

ИМХО для печати в фиксированном формате PDF, если ответ

2 голосов
/ 12 января 2009

Даже если вы заявили, что пробовали подход, основанный на CSS, лучший способ продвинуться вперед - взглянуть на тип носителя @print (http://www.w3.org/TR/CSS2/media.html).. В основном позволяет использовать другую таблицу стилей для печать, чем для экрана, или любого другого (многих) типов носителей.

Затем, если вы хотите запустить событие печати автоматически, вы хотите использовать что-то вроде этого (JavaScript):

window.print();

Конечно, вам нужно проверить, действительно ли браузер поддерживает печать через JavaScript, и действовать соответственно:

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

Если, однако, вы непреклонны в том, что CSS не будет соответствовать вашим потребностям, то вам, вероятно, нужно будет перейти к решению на основе PDF. Хотя у меня нет опыта в создании распечаток через «PDF».

1 голос
/ 12 января 2009

Если вы используете SQL Server, вы можете создать отчет, используя службы отчетов. Затем пользователь может либо распечатать его напрямую, либо экспортировать самостоятельно в несколько различных форматов (вы можете контролировать, какие форматы доступны пользователю).

Я использовал этот подход в прошлом и обнаружил, что он дает мне гораздо больше контроля над внешним видом документа при его печати или экспорте.

...