2

私は 3 日から 1 つの PDF ドキュメントを作成する方法を見つけようとしています。

問題なくアクセスして入力できるフォームフィールドはほとんどありません。このフィールドの下に、動的に作成されたテーブルを配置します。このテーブルは、複数のページに十分な長さになる場合があります。そして、ここに私の問題があります。フォーム フィールドがすぐ下にある同じページにこのテーブルを追加することはできません。PDFファイルをマージする例を見つけました。そして今、私はこのシナリオを持っています。

  1. フォーム フィールドが入力された 1 つの PDF を作成する
  2. 常に1ページしかないpdfTableでpdfを作成しますが、コンテンツは長くなります
  3. 最初の2つからマージされたpdfを作成します。最初のページには入力されたフォーム フィールドがあり、2 番目のページには私の pdfTable があります。

最初のページから始まり、次のページに続くフォームフィールドとテーブルが必要です。

少し混乱しているコードを投稿しますが...

string pdfTemplate = Server.MapPath("~/PDF/") + "invoiceTest.pdf";
        string newFile = Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf";

        using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Create))
        using (FileStream formFile = new FileStream(Server.MapPath("~/PDF/") + "invoiceTest.pdf", FileMode.Open))
        {
            PdfReader reader = new PdfReader(formFile);
            using (Document document = new Document(reader.GetPageSizeWithRotation(1)))
            {
                PdfStamper outStamper = new PdfStamper(reader, ms);
                PdfContentByte body = outStamper.GetOverContent(reader.NumberOfPages);

                document.Open(); //Open document to work with

                AcroFields fields = outStamper.AcroFields;

                BaseFont bfComic = BaseFont.CreateFont(Server.MapPath("~/PDF/") + "trebuc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                Font font = new Font(bfComic, 12);

                // UPDATE THE FORM FIELDS
                fields.SetFieldProperty("txtContragentName", "textfont", bfComic, null);
                fields.SetField("txtContragentName", "Фрея");
                fields.SetFieldProperty("txtContragentCode", "textfont", bfComic, null);
                fields.SetField("txtContragentCode", "DGB34TT");
                fields.SetFieldProperty("txtDateCreated", "textfont", bfComic, null);
                fields.SetField("txtDateCreated", "03.06.2013");

                outStamper.Close();
            }
        }

        using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 2 + ".pdf", FileMode.Create))
        using (FileStream formFile = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Open))
        {
            PdfReader reader = new PdfReader(formFile);
            using (Document document = new Document(reader.GetPageSizeWithRotation(1)))
            {
                PdfWriter writer = PdfWriter.GetInstance(document, ms);
                document.Open();
                //Paragraph heading = new Paragraph("Page Heading", new Font(Font.FontFamily.HELVETICA, 10f, Font.BOLD));
                //heading.SpacingAfter = 8f;
                //doc.Add(heading);
                string text = @"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Suspendisse blandit blandit turpis. Nam in lectus ut dolor consectetuer bibendum. Morbi neque ipsum, laoreet id; dignissim et, viverra id, mauris. Nulla mauris elit, consectetuer sit amet, accumsan eget, congue ac, libero. Vivamus suscipit. Nunc dignissim consectetuer lectus. Fusce elit nisi; commodo non, facilisis quis, hendrerit eu, dolor? Suspendisse eleifend nisi ut magna. Phasellus id lectus! Vivamus laoreet enim et dolor. Integer arcu mauris, ultricies vel, porta quis, venenatis at, libero. Donec nibh est, adipiscing et, ullamcorper vitae, placerat at, diam. Integer ac turpis vel ligula rutrum auctor! Morbi egestas erat sit amet diam. Ut ut ipsum? Aliquam non sem. Nulla risus eros, mollis quis, blandit ut; luctus eget, urna. Vestibulum vestibulum dapibus erat. Proin egestas leo a metus?";
                PdfContentByte cb = writer.DirectContent;
                ColumnText columns = new ColumnText(cb);
                //float left, float right, float gutterwidth, int numcolumns
                columns.SetSimpleColumn(40, 20, document.PageSize.Width - 40, document.PageSize.Height - 20);
                //Paragraph para = new Paragraph(text, new Font(Font.FontFamily.HELVETICA, 8f));
                ////para.SpacingAfter = 9f;
                //para.Alignment = Element.ALIGN_JUSTIFIED;
                //for (int i = 0; i < 28; i++)
                //{
                //    columns.AddElement(para);
                //}

                //columns.Go();

                BaseFont bfComic = BaseFont.CreateFont(Server.MapPath("~/PDF/") + "trebuc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                Font font = new Font(bfComic, 12);
                PdfPTable table = new PdfPTable(10);
                table.HorizontalAlignment = Element.ALIGN_LEFT;
                table.DefaultCell.HorizontalAlignment = Element.ALIGN_RIGHT;
                table.WidthPercentage = 100;
                PdfPCell cell1 = new PdfPCell(new Phrase("ДАТА", new Font(bfComic, 10f, Font.NORMAL, BaseColor.WHITE))) { HorizontalAlignment = 1, VerticalAlignment = 2 };
                cell1.BackgroundColor = new iTextSharp.text.BaseColor(System.Drawing.ColorTranslator.FromHtml("#808080"));

                PdfPCell cell2 = new PdfPCell(new Phrase("Header spanning 3 columns", new Font(Font.NORMAL, 10f, Font.NORMAL, BaseColor.WHITE))) { HorizontalAlignment = 1 };
                cell2.BackgroundColor = new iTextSharp.text.BaseColor(System.Drawing.ColorTranslator.FromHtml("#808080"));

                table.AddCell(cell1);
                table.AddCell(cell2);
                //dump data to be set
                #region dump data
                for (int i = 0; i < 100; i++)
                {
                    table.AddCell("Col 1 Row 1");
                }

                #endregion

                float[] widths = new float[] { 200f, 200f, 200f, 200f, 100f, 100f, 100f, 100f, 100f, 100f };
                table.SetWidths(widths);
                table.CompleteRow(); //Added - table won't add the final row if its cells are incomplete - safe to have it ending a table
                columns.AddElement(table);
                columns.Go();
            }
        }

        using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 3 + ".pdf", FileMode.Create))
        using (FileStream stampedfile = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Open))
        using (FileStream appendfile = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 2 + ".pdf", FileMode.Open))
        {
            PdfReader stampedContentReader = new PdfReader(stampedfile);
            PdfReader appendContentReader = new PdfReader(appendfile);

            using (Document document = new Document(stampedContentReader.GetPageSizeWithRotation(1)))
            {
                PdfCopy pdfCopy = new PdfCopy(document, ms);

                document.Open();

                for (int i = 1; i <= stampedContentReader.NumberOfPages; i++)
                    pdfCopy.AddPage(pdfCopy.GetImportedPage(stampedContentReader, i));

                for (int i = 1; i <= appendContentReader.NumberOfPages; i++)
                    pdfCopy.AddPage(pdfCopy.GetImportedPage(appendContentReader, i));
            }
        }
4

1 に答える 1

1

あなたのコードは本当に混乱しています。コピーして貼り付けますが、私は C# 開発者ではないことをご理解ください。私が知っているのは Java だけで、iText は裏返しに知っています (私はその最初の開発者です)。

string pdfTemplate = Server.MapPath("~/PDF/") + "invoiceTest.pdf";
string newFile = Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf";

using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Create))
using (FileStream formFile = new FileStream(Server.MapPath("~/PDF/") + "invoiceTest.pdf", FileMode.Open))
{
    PdfReader reader = new PdfReader(formFile);
    // YOU DON'T NEED A DOCUMENT OBJECT HERE!
    // READ THE DOCUMENTATION!!!
    PdfStamper outStamper = new PdfStamper(reader, ms);
    AcroFields fields = outStamper.AcroFields;
    BaseFont bfComic = BaseFont.CreateFont(Server.MapPath("~/PDF/") + "trebuc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    // UPDATE THE FORM FIELDS
    fields.SetFieldProperty("txtContragentName", "textfont", bfComic, null);
    fields.SetField("txtContragentName", "Фрея");
    fields.SetFieldProperty("txtContragentCode", "textfont", bfComic, null);
    fields.SetField("txtContragentCode", "DGB34TT");
    fields.SetFieldProperty("txtDateCreated", "textfont", bfComic, null);
    fields.SetField("txtDateCreated", "03.06.2013");
    outStamper.Close();
}

using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 2 + ".pdf", FileMode.Create))
using (FileStream formFile = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Open))
{
    PdfReader reader = new PdfReader(formFile);
    // I'm adding extra parameters to change the margins so that they match what you had when you defined your ColumnText object
    using (Document document = new Document(reader.GetPageSizeWithRotation(1), 40, 40, 20, 20))
    {
        PdfWriter writer = PdfWriter.GetInstance(document, ms);
        document.Open();
        // HEADERS ARE ADDED WITH PAGE EVENTS!!!
        // PLEASE READ ABOUT PAGE EVENTS IF YOU NEED PAGE HEADERS
        string text = @"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Suspendisse blandit blandit turpis. Nam in lectus ut dolor consectetuer bibendum. Morbi neque ipsum, laoreet id; dignissim et, viverra id, mauris. Nulla mauris elit, consectetuer sit amet, accumsan eget, congue ac, libero. Vivamus suscipit. Nunc dignissim consectetuer lectus. Fusce elit nisi; commodo non, facilisis quis, hendrerit eu, dolor? Suspendisse eleifend nisi ut magna. Phasellus id lectus! Vivamus laoreet enim et dolor. Integer arcu mauris, ultricies vel, porta quis, venenatis at, libero. Donec nibh est, adipiscing et, ullamcorper vitae, placerat at, diam. Integer ac turpis vel ligula rutrum auctor! Morbi egestas erat sit amet diam. Ut ut ipsum? Aliquam non sem. Nulla risus eros, mollis quis, blandit ut; luctus eget, urna. Vestibulum vestibulum dapibus erat. Proin egestas leo a metus?";
        BaseFont bfComic = BaseFont.CreateFont(Server.MapPath("~/PDF/") + "trebuc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font = new Font(bfComic, 12);
        PdfPTable table = new PdfPTable(10);
        // The next line doesn't make sense if the width percentage is 100%
        // table.HorizontalAlignment = Element.ALIGN_LEFT;
        table.DefaultCell.HorizontalAlignment = Element.ALIGN_RIGHT;
        table.WidthPercentage = 100;
        PdfPCell cell1 = new PdfPCell(new Phrase("ДАТА", new Font(bfComic, 10f, Font.NORMAL, BaseColor.WHITE))) { HorizontalAlignment = 1, VerticalAlignment = 2 };
        cell1.BackgroundColor = new iTextSharp.text.BaseColor(System.Drawing.ColorTranslator.FromHtml("#808080"));
        PdfPCell cell2 = new PdfPCell(new Phrase("Header spanning 3 columns", new Font(Font.NORMAL, 10f, Font.NORMAL, BaseColor.WHITE))) { HorizontalAlignment = 1 };
        cell2.BackgroundColor = new iTextSharp.text.BaseColor(System.Drawing.ColorTranslator.FromHtml("#808080"));
        table.AddCell(cell1);
        table.AddCell(cell2);
        //dump data to be set
        #region dump data
        for (int i = 0; i < 100; i++)
        {
            table.AddCell("Col 1 Row 1");
        }
        #endregion
        float[] widths = new float[] { 200f, 200f, 200f, 200f, 100f, 100f, 100f, 100f, 100f, 100f };
        table.SetWidths(widths);
        table.CompleteRow(); //Added - table won't add the final row if its cells are incomplete - safe to have it ending a table
        document.Add(table);
    }
}

コードの最初の部分で犯した大きな間違いは、Document. その必要はありません。私の本の第 6 章を読んで、 C# の例を見てください。

2 番目の部分で犯した主な間違いはColumnText、レイアウトを制御したいという意味を使用しているのに、その制御を処理する方法がわからないことです。を使用する場合はColumnText、すべてのコンテンツが消費されたかどうかを列に尋ねる必要があります。そうでない場合は、自分で新しいページを作成する必要があります。これはすべて、私の本の第 3 章で説明されています。

3 番目の部分は問題ないようです (C# を理解する限り)。

私が本を書いたのは、人々が最初から正しいコードを書くことで時間を節約できるようにするためです。私は自分の本を書いていないので、StackOverflow にコピー/貼り付けする必要があります ;-)

于 2013-06-06T07:07:04.940 に答える