-1

ボタンのクリックごとに 1 つのレコードだけのデータを入力している W9 PDF ドキュメントがあります。ここで、クライアントは、各レコードがドキュメント内のページである単一のドキュメントを作成したいと考えています。以下は、各従業員の PDF を作成するコードです。

    protected void lnkFillFields_Click(object sender, EventArgs e)
    {
        using (Library.Data.PDFData data = new Library.Data.PDFData())
        {
            try
            {   
                Document document = new Document();
                PdfCopy writer = new PdfCopy(document, Response.OutputStream);
                document.Open();

                foreach (EmployeeData emp in data.sp_select_employee_data())
                {
                    //Creates a PDF from a byte array
                    PdfReader reader =
                        new PdfReader((Byte[])data.sp_select_doc(16).Tables[0].Rows[0]["doc"]);

                    //Creates a "stamper" object used to populate interactive fields
                    MemoryStream ms = new MemoryStream();
                    PdfStamper stamper = new PdfStamper(reader, ms);

                    try
                    {
                        //MUST HAVE HERE BEFORE STREAMING!!!
                        //This line populates the interactive fields with your data.
                        //  false = Keeps the fields as editable
                        //  true  = Turns all of the editable fields to their read-only equivalent
                        stamper.FormFlattening = false;

                        //fill in PDF here

                        stamper.Close();
                        reader.Close();

                        MergePDFs(writer, ms);
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }

                }

                document.Close();

                //Stream the file to the user
                Response.ContentType = "application/pdf";
                Response.BufferOutput = true;
                Response.AppendHeader("Content-Disposition", "attachment; filename=W9"+ "_Complete.pdf");
                Response.Flush();
                Response.End();
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }

ページを挿入する方法ではありませんでした。代わりに、ドキュメントをマージすることが本質的に私たちが望んでいたことでした。したがって、次の方法を考え出しました。

更新 以下は、新しい PDF を以前の PDF に正常にステッチするために私たちが思いついた方法です。

    private static void MergePDFs(PdfCopy writer, MemoryStream ms)
    {
        PdfReader populated_reader = new PdfReader(ms.ToArray());
        //Add this pdf to the combined writer
        int n = populated_reader.NumberOfPages;
        for (int i = 1; i <= n; i++)
        {
            PdfImportedPage page = writer.GetImportedPage(populated_reader, i);
            writer.AddPage(page);
        }
    }

私たちがしなければならないことは、これらすべてをメモリ内に作成し、それをユーザーに吐き出してダウンロードさせることです。

4

1 に答える 1

1

PDF を結合/結合する方法については、こちらの kuujinbo のチュートリアルをご覧ください。

その前に、明らかに PDF も生成する必要があります。すべてを 1 つのパスで実行しようとする誘惑に駆られるかもしれませんが、これは機能しますが、デバッグが難しくなります。代わりに、2 つのパスを作成することをお勧めします。1 回目は個々のドキュメントを作成し、2 回目はそれらを結合します。最初のパスでは、それらをディスクまたはメモリに一時的に書き込むことができます。あなたのコード(およびkuujinbo's)は、実際にResponseは完全に有効なストリームに直接書き込みますが、特にすべてを巨大なでラップする場合、デバッグがはるかに困難ですtry/catch

結合する PDF の数と生成の頻度によって、最初のパス 2 を一時的に保存する場所が決まります。1ダースまたは2つしか実行していない場合、それらが巨大ではない場合、私はそれに固執し、MemoryStreamその.ToArray()バイトデータを操作します。

それよりも多くの PDF を持っているか、かなり大きいか、このルーチンが頻繁に呼び出されるか、RAM の制約がある場合は、最初にそれらを一意のフォルダーに保存し、それらをつなぎ合わせてからそのフォルダーを削除する方がよい場合があります。

于 2013-09-23T18:21:34.860 に答える