iTextSharp生成pdf的一个简单例子

时间:2023-03-08 16:38:37

效果图:iTextSharp生成pdf的一个简单例子

参考:http://www.cnblogs.com/CareySon/archive/2011/11/09/2243496.html

http://www.cnblogs.com/julyluo/p/3839788.html

itextsharp版本:4.1.6.0

代码:

  /// <summary>
/// Compare页面生成pdf功能。
/// </summary>
/// <param name="country">国家</param>
/// <param name="pns">pn</param>
/// <param name="language">语言</param>
/// <returns>响应对象</returns>
public string ComparePdf(string country, string[] pns, string language)
{
var result = "";
//生成pdf
Document document = new Document(); //这样写:是生成一个文件到某目录中
//var directory = HttpContext.Current.Server.MapPath("~/pdf");
//string host = HttpContext.Current.Request.Url.Host;
//int port = HttpContext.Current.Request.Url.Port;
//if (!Directory.Exists(directory))
//{
// Directory.CreateDirectory(directory);
//}
//var fileName = "";
//foreach (var item in pns)
//{
// fileName += "_" + item + "_";
//}
//fileName = "Compare" + fileName + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";
//var pdfPath = directory + "\\" + fileName;
//var fileStream = new FileStream(pdfPath, FileMode.Create);
//PdfWriter pw = PdfWriter.GetInstance(document, fileStream); //这样写:是生成文件到内存中去
var memoryStream = new MemoryStream();
PdfWriter pw = PdfWriter.GetInstance(document, memoryStream);//生成到内存中 //数据
var list = Compare(country, pns, language);
document.Open();//打开文件
//写入数据
//注册字体
string fontpath = HttpContext.Current.Server.MapPath("~/App_Data");
BaseFont customfont = BaseFont.CreateFont(fontpath + "\\Lato-Regular.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
var baseFont = new Font(customfont, 14 * 0.667f, Font.NORMAL, new Color(68, 68, 68));
var leftFont = new Font(customfont, 14 * 0.667f, Font.BOLD, new Color(68, 68, 68));
#region 头部
PdfPTable tableLogo = new PdfPTable(3);
tableLogo.DefaultCell.Border = Rectangle.NO_BORDER;
tableLogo.DefaultCell.MinimumHeight = 40f;
float[] headWidths = new float[] { 60f, 60f, 150f };
tableLogo.SetWidths(headWidths);
//logo
var logo = iTextSharp.text.Image.GetInstance("http://d1fyvoqprbjuee.cloudfront.net/smartfindimages/logo.png");
logo.ScaleToFit(130 * 0.667f, 43 * 0.667f);
var logoCell = new PdfPCell();
logoCell.PaddingLeft = -1f;
logoCell.MinimumHeight = 45f;
logoCell.HorizontalAlignment = Element.ALIGN_LEFT;
logoCell.Border = 0;
logoCell.AddElement(logo);
tableLogo.AddCell(logoCell); var headFont = new Font(customfont, 26 * 0.667f, Font.BOLD, new Color(68, 68, 68));
var sCell = new PdfPCell(new Paragraph("SmartFind", headFont));
sCell.Border = 0;
sCell.PaddingLeft = 3f;
sCell.PaddingBottom = 17f;
sCell.MinimumHeight = 45f;
sCell.HorizontalAlignment = Element.ALIGN_LEFT;
sCell.VerticalAlignment = Element.ALIGN_BOTTOM;
tableLogo.AddCell(sCell); var aCell = new PdfPCell();
aCell.Border = 0;
aCell.MinimumHeight = 45f;
aCell.PaddingBottom = 17f;
aCell.HorizontalAlignment = Element.ALIGN_LEFT;
aCell.VerticalAlignment = Element.ALIGN_BOTTOM;
var accFont = new Font(customfont, 18 * 0.667f, Font.NORMAL, new Color(170, 170, 170));
var acc = new Paragraph("| Accessories", accFont);
aCell.AddElement(acc);
tableLogo.AddCell(aCell); document.Add(tableLogo);
#endregion document.Add(new Paragraph("")); #region 中间的表格
PdfPTable table = new PdfPTable(list.Count + 1);//n列的表格
table.DefaultCell.Border = 0;
table.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER;
table.DefaultCell.VerticalAlignment = Element.ALIGN_MIDDLE; //根据图片数量确定列数及列宽
if (pns.Count() == 1)
{
float[] widths = new float[] { 2f, 3f };
table.SetWidths(widths);
}
else if (pns.Count() == 2)
{
float[] widths = new float[] { 2f, 3f, 3f };
table.SetWidths(widths);
}
else if (pns.Count() == 3)
{
float[] widths = new float[] { 2f, 3f, 3f, 3f };
table.SetWidths(widths);
}
else if (pns.Count() == 4)
{
float[] widths = new float[] { 2f, 3f, 3f, 3f, 3f };
table.SetWidths(widths);
}
//左单元格
var leftCell = new PdfPCell(new Paragraph("Images", leftFont));
leftCell.MinimumHeight = 40f;
leftCell.BackgroundColor = new Color(242, 242, 242);
leftCell.HorizontalAlignment = Element.ALIGN_CENTER;
leftCell.VerticalAlignment = Element.ALIGN_MIDDLE;
table.AddCell(leftCell); //右单元格
var rightCell = new PdfPCell();
rightCell.HorizontalAlignment = Element.ALIGN_CENTER;
rightCell.VerticalAlignment = Element.ALIGN_MIDDLE;
rightCell.MinimumHeight = 40f; foreach (var item in list)
{
var imageCell = new PdfPCell();
imageCell.Padding = 1f;
//根据图片数量确定左边距,确保图片在中间显示。这个地方写的不好,暂时这样
if (list.Count == 2)
{
imageCell.PaddingLeft = 30f;
}
if (list.Count == 1)
{
imageCell.PaddingLeft = 80f;
}
if (list.Count == 3)
{
imageCell.PaddingLeft = 10f;
}
//确保网络图片存在
if (!string.IsNullOrEmpty(item.Url) && Helper.IsExists(item.Url + "-218.png"))
{
var image = iTextSharp.text.Image.GetInstance(item.Url + "-218.png");
if (list.Count == 4)
{
image.ScaleToFit(80f, 80f);
}
else
{
image.ScaleToFit(100f, 100f);
}
imageCell.AddElement(image);
}
table.AddCell(imageCell);
} //Product Title
leftCell.Phrase = new Paragraph("Product Title", leftFont);
var titleFont = new Font(customfont, 14 * 0.667f, Font.NORMAL, new Color(255, 105, 0));
table.AddCell(leftCell);
foreach (var item in list)
{
rightCell.Phrase = new Paragraph(item.Title, titleFont);
table.AddCell(rightCell);
} //List Price
leftCell.Phrase = new Paragraph("List Price", leftFont);
table.AddCell(leftCell);
foreach (var item in list)
{
rightCell.Phrase = new Paragraph(item.Currency + item.Price, baseFont);
table.AddCell(rightCell);
} //Part Number
leftCell.Phrase = new Paragraph("Part Number", leftFont);
table.AddCell(leftCell);
foreach (var item in list)
{
rightCell.Phrase = new Paragraph(item.PN, baseFont);
table.AddCell(rightCell);
} //facet
var first = list.FirstOrDefault();
foreach (var item in first.Facets)
{
leftCell.Phrase = new Paragraph(item.Key, leftFont);
table.AddCell(leftCell);
rightCell.Phrase = new Paragraph(item.Value, baseFont);
table.AddCell(rightCell);
//其余的
list.Remove(first);
var other = list;
foreach (var one in other)
{
rightCell.Phrase = new Paragraph(one.Facets.FirstOrDefault(o => o.Key == item.Key).Value, baseFont);
table.AddCell(rightCell);
}
}
document.Add(table);
#endregion //页脚
PDFFooter footer = new PDFFooter();
footer.OnEndPage(pw, document);
document.Close();
var bytes = memoryStream.ToArray();
result = Convert.ToBase64String(bytes); return result;
} /// <summary>
/// 页脚类
/// </summary>
public class PDFFooter : PdfPageEventHelper
{
// write on top of document
public override void OnOpenDocument(PdfWriter writer, Document document)
{
base.OnOpenDocument(writer, document);
PdfPTable tabFot = new PdfPTable(new float[] { 1F });
tabFot.SpacingAfter = 10F;
PdfPCell cell;
tabFot.TotalWidth = 300F;
cell = new PdfPCell(new Phrase("Header"));
tabFot.AddCell(cell);
tabFot.WriteSelectedRows(0, -1, 150, document.Top, writer.DirectContent);
} // write on start of each page
public override void OnStartPage(PdfWriter writer, Document document)
{
base.OnStartPage(writer, document);
} // write on end of each page
public override void OnEndPage(PdfWriter writer, Document document)
{
base.OnEndPage(writer, document);
PdfPTable tabFot = new PdfPTable(new float[] { 1F });
tabFot.TotalWidth = 700f;
tabFot.DefaultCell.Border = 0;
// var footFont = FontFactory.GetFont("Lato", 12 * 0.667f, new Color(60, 60, 60));
string fontpath = HttpContext.Current.Server.MapPath("~/App_Data");
BaseFont customfont = BaseFont.CreateFont(fontpath + "\\Lato-Regular.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
var footFont = new Font(customfont, 12 * 0.667f, Font.NORMAL, new Color(170, 170, 170)); PdfPCell cell;
cell = new PdfPCell(new Phrase("@ 2016 . All Rights Reserved", footFont));
cell.VerticalAlignment = Element.ALIGN_CENTER;
cell.Border = 0;
cell.PaddingLeft = 100f;
tabFot.AddCell(cell);
tabFot.WriteSelectedRows(0, -1, 150, document.Bottom, writer.DirectContent);
} //write on close of document
public override void OnCloseDocument(PdfWriter writer, Document document)
{
base.OnCloseDocument(writer, document);
}
}

  

 /// <summary>
/// 判断网络文件是否存在
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static bool IsExists(string url)
{
try
{
using (new WebClient().OpenRead(url)) { }
return true;
}
catch (WebException)
{
return false;
}
}

  其他注意点:

1、当字体不支持中文、日文、繁体中文

 public string[] ChineseFont = new string[] { "Traditional Chinese [zh-tw]", "Japanese [ja]" };

 BaseFont customfont = BaseFont.CreateFont(fontpath + "\\Lato-Regular.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
if (ChineseFont.Contains(data.Language))
{
customfont = BaseFont.CreateFont(fontpath + "\\msyh.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
}

要写BaseFont.IDENTITY_H

2、表格的边框

设置 table.DefaultCell.Border = 0;是不能约束单元格的边框的,必须每个单元格单独设置边框pnCell.Border=0或设置其他宽度及四面是否显示。

3、表格位置

一个表格默认是在页面中居中对齐,要设置 左对齐: pnTable.HorizontalAlignment = Element.ALIGN_LEFT;

4、表格中嵌套表格

嵌套的表格不会占满此行,设置了此表格左对齐,右边留白很多。要完全设置表格的宽度,并且锁定才行。

pnTable.TotalWidth = 404 * 0.667f;
pnTable.LockedWidth = true;

5、链接。

链接要用块来实现。

var linkCell = new PdfPCell();
linkCell.BorderWidthTop = ;
linkCell.Padding = 5f;
linkCell.PaddingLeft = 10f;
linkCell.PaddingBottom = 20f;
var chunk = new Chunk("More Information", link14);
chunk.SetAnchor("http://accsmartfind.lenovo.com/products/" + model.PN);
linkCell.AddElement(chunk);
table.AddCell(linkCell);

6、样式。

样式不行表格来凑,如果样式还不出来,再加一个表格。

代码:https://pan.baidu.com/s/1bwjMZcfCwndFeSfmG9zd6w  ,里面的对象数据要自己添加些调试。vs2013.