为什么我的边距会使用itextsharp在第二页上更改?

时间:2016-07-12 18:27:39

标签: itext

我使用itextsharp来创建pdfs。但是,由于某种原因我无法理解,当文本进入第二页时,它会跳下一条线。我没有在任何地方添加Chunk.NEWLINE,因此我只能假设文档边距发生变化。此更改仅发生在第1-2页;然后它对于文档的其余部分保持不变。

当我创建一个向页面添加标题的方法时,我注意到了它,它覆盖了OnEndPage;尽管如此,当我不打电话给方法时,效果就会发生,并且根本不会改变OnEndPage或边缘。谁能告诉我为什么会这样?

以下是我用来创建pdf的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using it = iTextSharp.text;
using System.Diagnostics;
using System.Drawing;
using System.Data;
using Helper;

namespace Andrew
{
    public class AndrewFunctions
    {
        public void createPDF()
        {
            //Create new document
            Document doc = new Document(PageSize.A4);

        //Create instance= of pdfwriter named test to write to file
        PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(@"C:\Users\Gabriela\Desktop\test.pdf", FileMode.Create));

        try
        {
            //Add primary info to pdf and open for editing  
            doc.AddTitle("My first pdf");
            doc.AddCreator("Andrew Birch");                

            //Set font and color
            it.Font myfont = FontFactory.GetFont("Garamond");
            myfont.SetColor(51, 51, 255);

            doc.Open();

            //Add filler content to pdf
            for (int i = 0; i < 1200; i++)
            {
                doc.Add(new Phrase("This is filler text", myfont));
            }  

            //Create header table
            PdfPTable testTable = new PdfPTable(3);
            testTable.WidthPercentage = 100f; 
            float[] widths = { 1f, 3f, 1f };
            testTable.SetWidths(widths);

            //Header table images
            string path = "C:\\Users\\Gabriela\\Desktop\\descarga.png";
            it.Image logo = doc.ImportarImagen(path, 24f);
            path = "C:\\Users\\Gabriela\\Desktop\\descarga2.png";
            it.Image logo2 = doc.ImportarImagen(path, 24f, AlineacionCelda.CentradoVCentradoH);

            //Fill header table
            doc.CrearCeldaImagen(logo, testTable, false, it.Color.BLUE, AlineacionCelda.CentradoVCentradoH, rowspan: 4);
            doc.CrearCelda("TEST TABLE HEADER", testTable, font, it.Color.BLUE, AlineacionCelda.Centro, BordeCelda.SinBorde);
            doc.CrearCeldaImagen(logo2, testTable, false, it.Color.BLUE, AlineacionCelda.CentradoVCentradoH, rowspan: 4);
            doc.CrearCelda("HEADER LINE TWO WITH A WICKED SUBTITLE", testTable, font, it.Color.BLUE, AlineacionCelda.Centro, BordeCelda.SinBorde);
            doc.CrearCelda("HEADER LINE THREE", testTable, font, it.Color.BLUE, AlineacionCelda.Centro, BordeCelda.SinBorde);
            doc.CrearCelda("YOU GUESSED IT, HEADER LINE 4", testTable, font, it.Color.BLUE, AlineacionCelda.Centro, BordeCelda.SinBorde);

            //Add heading before opening doc
            doc.AgregarCabezado(testTable, writer, doc);

        }
        catch (it.DocumentException dex)
        {
            Console.WriteLine(dex.Message);
        }
        catch (IOException ioex)
        {
            Console.WriteLine(ioex.Message);
        }
        finally
        {
            //Close doc and writing stream
            doc.Close();
            writer.Close();
        }
    }

使用标题更容易理解差异,一些屏幕截图显示我的意思:

Without Header, page 1

Without Header, page 2

使用标题,第1页:i.stack.imgur.com/m8rmm.png

使用标题,第2页:i.stack.imgur.com/VV8a7.png

命名空间Helper:

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using it = iTextSharp.text;
using OfficeOpenXml;
using OfficeOpenXml.Drawing;
using System.Diagnostics;
using System.Drawing;
using System.Data;
using System.Web;

namespace Helper
{
    //Alignment values
    public enum AlineacionCelda : byte
    {
        Izquierda = 1,
        Centro,
        Derecha,
        AbajoIzquierda,
        CentradoVCentradoH,
        Justificado
    }
    //Border values
    public enum BordeCelda : byte
    {
        SinBorde,
        Arriba,
        Abajo,
        ArribaAbajo,
        Izquierda,
        IzquierdoArriba,
        IzquierdoAbajo,
        IzquierdoArribaAbajo,
        Derecha,
        DerechaArriba,
        DerechaAbajo,
        DerechaArribaAbajo,
        DerechaIzquierda,
        DerechaIzquierdaArriba,
        DerechaIzquierdaAbajo,
        Todos
    }

    public class Pdf : it.Document
    {
        //Default variables
        public static it.Font fuenteDefaultStatic = FontFactory.GetFont("Arial", 11, it.Font.NORMAL, it.Color.BLACK);
        public it.Font fuenteDefault = FontFactory.GetFont("Arial", 11, it.Font.NORMAL, it.Color.BLACK);
        public it.Font fuentePartidaDefault = FontFactory.GetFont("Arial", 9, it.Font.NORMAL, it.Color.BLACK);
        public it.Font fuentePartidaNegritaDefault = FontFactory.GetFont("Arial", 9, it.Font.BOLD, it.Color.BLACK);
        public it.Font fuenteNegritaDefault = FontFactory.GetFont("Arial", 11, it.Font.BOLD, it.Color.BLACK);
        public it.Color fondoDefault = iTextSharp.text.Color.WHITE;

        public Pdf() : base() { }
        public Pdf(it.Rectangle pageSize): base(pageSize) {}
        public Pdf(it.Rectangle pageSize, float marginLeft, float marginRight, float marginTop, float marginBottom) : base(pageSize, marginLeft, marginRight, marginTop, marginBottom) { }

        //Create a cell in the table specified with the attributes specified: use default values if any are omitted.  
        public void CrearCelda(string valor, PdfPTable tabla, iTextSharp.text.Font fuente = default(it.Font), it.Color fondo = default(it.Color), AlineacionCelda alineacion = AlineacionCelda.Izquierda, BordeCelda borde = BordeCelda.Todos,
        int colspan = 1, int rowspan = 1)
        {
            try
            {

                if (fuente == default(it.Font))
                {
                    fuente = fuenteDefault;
                }

                PdfPCell celda = new PdfPCell(new Phrase(valor, fuente));
                if (fondo == default(it.Color))
                {
                    fondo = fondoDefault;
                }

                celda.BackgroundColor = fondo;

                switch (borde) //Check and set border accordingly
                {
                    case BordeCelda.SinBorde: celda.Border = PdfPCell.NO_BORDER; break;
                    case BordeCelda.Arriba: celda.Border = PdfPCell.TOP_BORDER; break;
                    case BordeCelda.Abajo: celda.Border = PdfPCell.BOTTOM_BORDER; break;
                    case BordeCelda.ArribaAbajo: celda.Border = PdfPCell.TOP_BORDER | PdfPCell.BOTTOM_BORDER; break;
                    case BordeCelda.Izquierda: celda.Border = PdfPCell.LEFT_BORDER; break;
                    case BordeCelda.IzquierdoArriba: celda.Border = PdfPCell.LEFT_BORDER | PdfPCell.TOP_BORDER; break;
                    case BordeCelda.IzquierdoAbajo: celda.Border = PdfPCell.LEFT_BORDER | PdfPCell.BOTTOM_BORDER; break;
                    case BordeCelda.IzquierdoArribaAbajo: celda.Border = PdfPCell.LEFT_BORDER | PdfPCell.TOP_BORDER | PdfPCell.BOTTOM_BORDER; break;
                    case BordeCelda.Derecha: celda.Border = PdfPCell.RIGHT_BORDER; break;
                    case BordeCelda.DerechaArriba: celda.Border = PdfPCell.RIGHT_BORDER | PdfPCell.TOP_BORDER; break;
                    case BordeCelda.DerechaAbajo: celda.Border = PdfPCell.RIGHT_BORDER | PdfPCell.BOTTOM_BORDER; break;
                    case BordeCelda.DerechaArribaAbajo: celda.Border = PdfPCell.RIGHT_BORDER | PdfPCell.TOP_BORDER | PdfPCell.BOTTOM_BORDER; break;
                    case BordeCelda.DerechaIzquierda: celda.Border = PdfPCell.RIGHT_BORDER | PdfPCell.LEFT_BORDER; break;
                    case BordeCelda.DerechaIzquierdaArriba: celda.Border = PdfPCell.RIGHT_BORDER | PdfPCell.LEFT_BORDER | PdfPCell.TOP_BORDER; break;
                    case BordeCelda.DerechaIzquierdaAbajo: celda.Border = PdfPCell.RIGHT_BORDER | PdfPCell.LEFT_BORDER | PdfPCell.BOTTOM_BORDER; break;
                    case BordeCelda.Todos: celda.Border = PdfPCell.BOX; break;
                }

                if (colspan != 1)
                {
                    celda.Colspan = colspan;
                }
                else
                {
                    celda.Colspan = 1;
                }
                if (rowspan != 1)
                {
                  celda.Rowspan = rowspan;
                }
                else
                {
                    celda.Rowspan = 1;
                }

                switch (alineacion) //Check and set alignment accordingly
                {
                    case AlineacionCelda.Izquierda: celda.HorizontalAlignment = Element.ALIGN_LEFT; break;
                    case AlineacionCelda.Centro: celda.HorizontalAlignment = Element.ALIGN_CENTER; break;
                    case AlineacionCelda.Derecha: celda.HorizontalAlignment = Element.ALIGN_RIGHT; break;
                    case AlineacionCelda.AbajoIzquierda: celda.HorizontalAlignment = Element.ALIGN_LEFT; celda.VerticalAlignment = Element.ALIGN_BOTTOM; break;
                    case AlineacionCelda.CentradoVCentradoH: celda.HorizontalAlignment = Element.ALIGN_CENTER; celda.VerticalAlignment = Element.ALIGN_MIDDLE; break;
                    case AlineacionCelda.Justificado: celda.HorizontalAlignment = Element.ALIGN_JUSTIFIED; break;
                 }
                tabla.AddCell(celda);
            }
            catch (Exception ex)
            {
                throw ex;
            }
         }

        //Creates cell containing the image specified in the table specified
        public void CrearCeldaImagen(it.Image imagen, PdfPTable tabla, bool autoFit = false, it.Color fondo = default(it.Color), AlineacionCelda alineacion = AlineacionCelda.Izquierda, BordeCelda borde = BordeCelda.SinBorde,
        int colspan = 1, int rowspan = 1)
        {
            try
            {

                PdfPCell celda = new PdfPCell(imagen, autoFit);
                if (fondo != default(it.Color))
                {
                    celda.BackgroundColor = fondo;
                }

                switch (alineacion) //Checks and sets the alignment accordingly
                {
                    case AlineacionCelda.Izquierda: celda.HorizontalAlignment = Element.ALIGN_LEFT; break;
                    case AlineacionCelda.Centro: celda.HorizontalAlignment = Element.ALIGN_CENTER; break;
                    case AlineacionCelda.Derecha: celda.HorizontalAlignment = Element.ALIGN_RIGHT; break;
                    case AlineacionCelda.AbajoIzquierda: celda.HorizontalAlignment = Element.ALIGN_LEFT; celda.VerticalAlignment = Element.ALIGN_BOTTOM; break;
                    case AlineacionCelda.CentradoVCentradoH: celda.HorizontalAlignment = Element.ALIGN_CENTER; celda.VerticalAlignment = Element.ALIGN_MIDDLE; break;
                    default: celda.HorizontalAlignment = Element.ALIGN_LEFT; break;
                }

                switch (borde) //Checks and sets the border accordingly
                {
                    case BordeCelda.SinBorde: celda.Border = PdfPCell.NO_BORDER; break;
                    case BordeCelda.Arriba: celda.Border = PdfPCell.TOP_BORDER; break;
                    case BordeCelda.Abajo: celda.Border = PdfPCell.BOTTOM_BORDER; break;
                    case BordeCelda.ArribaAbajo: celda.Border = PdfPCell.TOP_BORDER | PdfPCell.BOTTOM_BORDER; break;
                    case BordeCelda.Izquierda: celda.Border = PdfPCell.LEFT_BORDER; break;
                    case BordeCelda.IzquierdoArriba: celda.Border = PdfPCell.LEFT_BORDER | PdfPCell.TOP_BORDER; break;
                    case BordeCelda.IzquierdoAbajo: celda.Border = PdfPCell.LEFT_BORDER | PdfPCell.BOTTOM_BORDER; break;
                    case BordeCelda.IzquierdoArribaAbajo: celda.Border = PdfPCell.LEFT_BORDER | PdfPCell.TOP_BORDER | PdfPCell.BOTTOM_BORDER; break;
                    case BordeCelda.Derecha: celda.Border = PdfPCell.RIGHT_BORDER; break;
                    case BordeCelda.DerechaArriba: celda.Border = PdfPCell.RIGHT_BORDER | PdfPCell.TOP_BORDER; break;
                    case BordeCelda.DerechaAbajo: celda.Border = PdfPCell.RIGHT_BORDER | PdfPCell.BOTTOM_BORDER; break;
                    case BordeCelda.DerechaArribaAbajo: celda.Border = PdfPCell.RIGHT_BORDER | PdfPCell.TOP_BORDER | PdfPCell.BOTTOM_BORDER; break;
                    case BordeCelda.DerechaIzquierda: celda.Border = PdfPCell.RIGHT_BORDER | PdfPCell.LEFT_BORDER; break;
                    case BordeCelda.DerechaIzquierdaArriba: celda.Border = PdfPCell.RIGHT_BORDER | PdfPCell.LEFT_BORDER | PdfPCell.TOP_BORDER; break;
                    case BordeCelda.DerechaIzquierdaAbajo: celda.Border = PdfPCell.RIGHT_BORDER | PdfPCell.LEFT_BORDER | PdfPCell.BOTTOM_BORDER; break;
                    case BordeCelda.Todos: celda.Border = PdfPCell.BOX; break;
                    default: celda.Border = PdfPCell.NO_BORDER; break; 
                }

                if (colspan != 1)
                    celda.Colspan = colspan;
                else
                {
                    celda.Colspan = 1;
                }
                if (rowspan != 1)
                    celda.Rowspan = rowspan;
                else
                    celda.Rowspan = 1;

                tabla.AddCell(celda);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        //Returns the image at the specified path, using the scale percentage, alignment, and border specified
        public it.Image ImportarImagen(string rutaImagen, float escalaPorcentaje = 100f, AlineacionCelda alineacion = AlineacionCelda.Izquierda, BordeCelda borde = BordeCelda.SinBorde)
        {
            it.Image imagen = it.Image.GetInstance(rutaImagen);
            imagen.ScalePercent(escalaPorcentaje);
            switch (alineacion) //Check and set alignment
            {
                case AlineacionCelda.Izquierda: imagen.Alignment = it.Image.ALIGN_LEFT; break;
                case AlineacionCelda.Centro: imagen.Alignment = it.Image.ALIGN_CENTER; break;
                case AlineacionCelda.Derecha: imagen.Alignment = it.Image.ALIGN_RIGHT; break;
                case AlineacionCelda.CentradoVCentradoH: imagen.Alignment = it.Image.ALIGN_CENTER | it.Image.ALIGN_MIDDLE; break;
                default: imagen.Alignment = Element.ALIGN_LEFT; break;
            }

            switch (borde) //Check and set border
            {
                case BordeCelda.SinBorde: imagen.Border = it.Image.NO_BORDER; break;
                case BordeCelda.Arriba: imagen.Border = it.Image.TOP_BORDER; break;
                case BordeCelda.Abajo: imagen.Border = it.Image.BOTTOM_BORDER; break;
                case BordeCelda.ArribaAbajo: imagen.Border = it.Image.TOP_BORDER | it.Image.BOTTOM_BORDER; break;
                case BordeCelda.Izquierda: imagen.Border = it.Image.LEFT_BORDER; break;
                case BordeCelda.IzquierdoArriba: imagen.Border = it.Image.LEFT_BORDER | it.Image.TOP_BORDER; break;
                case BordeCelda.IzquierdoAbajo: imagen.Border = it.Image.LEFT_BORDER | it.Image.BOTTOM_BORDER; break;
                case BordeCelda.IzquierdoArribaAbajo: imagen.Border = it.Image.LEFT_BORDER | it.Image.TOP_BORDER | it.Image.BOTTOM_BORDER; break;
                case BordeCelda.Derecha: imagen.Border = it.Image.RIGHT_BORDER; break;
                case BordeCelda.DerechaArriba: imagen.Border = it.Image.RIGHT_BORDER | it.Image.TOP_BORDER; break;
                case BordeCelda.DerechaAbajo: imagen.Border = it.Image.RIGHT_BORDER | it.Image.BOTTOM_BORDER; break;
                case BordeCelda.DerechaArribaAbajo: imagen.Border = it.Image.RIGHT_BORDER | it.Image.TOP_BORDER | it.Image.BOTTOM_BORDER; break;
                case BordeCelda.DerechaIzquierda: imagen.Border = it.Image.RIGHT_BORDER | it.Image.LEFT_BORDER; break;
                case BordeCelda.DerechaIzquierdaArriba: imagen.Border = it.Image.RIGHT_BORDER | it.Image.LEFT_BORDER | it.Image.TOP_BORDER; break;
                case BordeCelda.DerechaIzquierdaAbajo: imagen.Border = it.Image.RIGHT_BORDER | it.Image.LEFT_BORDER | it.Image.BOTTOM_BORDER; break;
                case BordeCelda.Todos: imagen.Border = it.Image.BOX; break;
                default: imagen.Border = it.Image.NO_BORDER; break;
            }
            if (imagen.Border != it.Image.NO_BORDER)
            {
                imagen.BorderWidth = 1f;
            }
            return imagen;
        }

        public void agregarCabezado(PdfPTable tabla, PdfWriter writer, Document document)
        {
            //Change margins to adapt to the Header
            document.SetMargins(document.LeftMargin, document.RightMargin, document.TopMargin + tabla.TotalHeight + 50f, document.BottomMargin);            
            Cabezado cabezado = new Cabezado(tabla);
            writer.PageEvent = cabezado;
        }

        public class Cabezado : PdfPageEventHelper
        {
            //Table used for the header
            public PdfPTable tablaCabezado { get; set; }

            public Cabezado(PdfPTable tabla)
            {
                this.tablaCabezado = tabla;
            }

            // Place the header on each page 
            public override void OnEndPage(PdfWriter writer, Document document)
            {
                 try
                 {
                      base.OnEndPage(writer, document);

                      //To ensure WriteSelectedRows respects the Rowspan
                      ArrayList tmp = tablaCabezado.GetRows(0, tablaCabezado.Size);
                      tablaCabezado.Rows.Clear();
                      tablaCabezado.Rows.AddRange(tmp);

                      //Calculate the positioning of the header
                      float posicionY = document.PageSize.Height - tablaCabezado.TotalHeight;
                      tablaCabezado.WriteSelectedRows(0, -1, 34, posicionY, writer.DirectContent);
                 }
                 catch (DocumentException ex)
                 {
                     throw ex;
                 }
            }
        }
   }
}

0 个答案:

没有答案