8

Web アプリケーションからどのように紙の印刷物を生成しますか?

具体的には、卒業証書、請求書、契約書など、より複雑な紙の文書について考えています。フレーム、表、ロゴ、ヘッダー/フッターを含む可変ページ数。

今日、私はカスタム フォームと CSS を特定のものに使用し、iTextSharp を他のものに使用しています (私は asp.net と MS-SQL を使用しています) が、どちらのアプローチも時間がかかり、異なるドキュメント間で一貫性を持たせるのが難しいと思います。

それについてもっと良い方法はありますか?

4

4 に答える 4

3

iTextSharp を使用してドキュメントをゼロから作成すると、非常に時間がかかる場合があります。別の方法として、(必要に応じて) フォーム フィールドを追加して PDF の「テンプレート」ドキュメントを作成 (または再利用) することもできます。これを行う最も簡単な方法は、完全版の Adob​​e Acrobat を使用することですが、iTextSharp だけを使用して入力可能なフォーム フィールドを追加することもできます。

たとえば、賞や卒業証書の場合、ドキュメントのすべてのテキスト、グラフィック、飾り枠、およびフォントを含む PDF を検索、作成、または変更してから、受信者の名前用のフォーム フィールドを追加します。日付、署名欄、賞の種類などのフィールドを追加できます。

次に、Web アプリケーションから iTextSharp を使用してフォームに入力し、フラット化し、ユーザーにストリーミングするのは非常に簡単です。

この投稿の最後に、完全な ASHX ハンドラ コード例を示します。

また、iTextSharp (または単に iText) は、PDF ドキュメントまたは異なるドキュメントのページを結合するのにも役立つことを覚えておいてください。したがって、表紙または説明ページのデザインが固定されているが動的に生成されるコンテンツを持つ年次報告書の場合、表紙を開いて、レポートのテンプレート ページを開き、テンプレートの空白領域に動的コンテンツを生成して、開くことができます。裏ページの「ボイラープレート」を作成し、それらをすべて 1 つのドキュメントに結合してユーザーに返します。

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;
            }
        }
    }
}
于 2009-01-22T01:05:55.833 に答える
3

答えがあれば、固定形式の印刷 PDF の私見

于 2009-01-12T09:44:04.680 に答える
2

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 を介して Web プリントアウトを作成した経験はありません。

于 2009-01-12T09:50:00.597 に答える