当内容较长时,Itextsharp不会创建新页面

本文关键字:Itextsharp 创建 新页面 | 更新日期: 2023-09-27 18:17:19

我从3天开始尝试制作一个pdf文档,我将感谢任何帮助。

我有几个表单字段访问和填充没有问题。在这个字段的下面,我想放置动态创建的表。这个表格可以很长,可以在不止一页上。这就是我的问题。我不能在同一个页面上添加这个表,表单字段就在它们下面。我找到了合并pdf文件的例子。现在我有了这个场景。

  1. 创建一个pdf格式的表格
  2. 用pdfTable制作pdf, pdfTable总是只有一个页面,但内容更长
  3. 制作pdf,这是从前两个合并。在第一页是填写表单字段,在第二页是我的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));
            }
        }

当内容较长时,Itextsharp不会创建新页面

你的代码真是一团糟。我会复制/粘贴它,但请理解,我不是一个c#开发人员。我只懂Java和ittext(我是它的原始开发人员)。

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#的例子。

你在第二部分中犯的主要错误是使用ColumnText意味着你想控制布局,但不知道如何处理该控制。如果使用ColumnText,则需要询问列是否消耗了所有内容。如果没有,您需要自己创建一个新页面。这些都在我的书的第三章里解释了。

第三部分看起来不错(就我对c#的理解而言)。

我写书是为了让人们从一开始就编写正确的代码,从而节省时间。我没有写我的书,所以我必须复制/粘贴它们在StackOverflow;-)