我使用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();
}
}
使用标题更容易理解差异,一些屏幕截图显示我的意思:
使用标题,第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;
}
}
}
}
}