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

时间:2013-06-05 19:11:06

标签: c# pdf itextsharp

我尝试从3天开始制作一份pdf文件,我将不胜感激。

我有几个表单字段,访问和填充没有问题。在这个字段下面我想放置动态创建的表。此表可以足够长,可以在多个页面上。这是我的问题。我不能将这个表添加到同一页面上,并在其下方使用表单fiels。我找到合并pdf文件的例子。现在我有了这种情况。

  1. 制作一个包含填写表格字段的pdf
  2. 使用pdfTable制作pdf,其中只有一页,但内容更长
  3. 制作从前两个合并的pdf。在第一页填写表单字段,在第二页是我的pdfTable。
  4. 我只想拥有从第一页开始的表单字段和表格,并继续下一页。

    我发布的代码有点乱,但......

    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));
                }
            }
    

1 个答案:

答案 0 :(得分: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。没有必要这样做。请阅读我的图书的chapter 6,然后查看C# examples

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

第三部分看起来不错(据我所知C#)。

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