效果图:

参考: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.

iTextSharp生成pdf的一个简单例子的更多相关文章

  1. ITextSharp用来生成 PDF 的一个组件

    iTextSharp 是用来生成  PDF 的一个组件,在 1998 年夏天的时候,Bruno Lowagie ,iText 的创作者,参与了学校的一个项目,当时使用 HTML 来生成报告,但是,使用 ...

  2. itextsharp生成pdf后的直接打印问题

    原文 itextsharp生成pdf后的直接打印问题 小弟这两天用itextsharp生成pdf文档,生成的pdf可以直接保存在指定路径的文件夹下,可是user不想保存,想要点一下button,就可以 ...

  3. iTextSharp生成PDF文件

    这是一篇简单的教程,所以只涉及一些iTextSharp生成pdf的简单应用,详细教程请搜索iTextSharp进入官网看官方文档(英文版). iTextSharp官方文档:https://itextp ...

  4. 一个简单例子:贫血模型or领域模型

    转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...

  5. (转)Java中使用正则表达式的一个简单例子及常用正则分享

    转自:http://www.jb51.net/article/67724.htm 这篇文章主要介绍了Java中使用正则表达式的一个简单例子及常用正则分享,本文用一个验证Email的例子讲解JAVA中如 ...

  6. C语言多线程的一个简单例子

    多线程的一个简单例子: #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...

  7. quartz---的一个简单例子

    quartz---的一个简单例子 首先建立一个maven项目.jar工程即可.(提示:我前面有如何建立一个maven工程的总结以及maven环境的配置.) 1.建立好后点击到app中运行,--> ...

  8. 用socket.io实现websocket的一个简单例子

    socket.io 是基于 webSocket 构建的跨浏览器的实时应用. 逛博客发现几个比较好的 一.用socket.io实现websocket的一个简单例子 http://biyeah.iteye ...

  9. 词法分析程序 LEX和VC6整合使用的一个简单例子

    词法分析的理论知识不少,包括了正规式.正规文法.它们之间的转换以及确定的有穷自动机和不确定的有穷自动机等等... 要自己写一个词法分析器也不会很难,只要给出了最简的有穷自动机,就能很方便实现了,用if ...

随机推荐

  1. 使用PowerDesigner设计建造MySQL数据库

    使用PowerDesigner设计建造MySQL数据库 一.使用PowerDesigner制作建库脚本 1.设计CDM(Conceptual Data Model) 2.选择 Tools -> ...

  2. 原生HTML5 input type=file按钮UI自定义

    原生<input type="file" name="file" />长得太丑 提升一下颜值 实现方案一.设置input[type=file]透明度 ...

  3. jQuery.my – 实时的复杂的双向数据绑定

    jQuery.my 这个插件用于实时双向数据绑定.它发生变异给出的数据源对象,反映了用户与用户界面之间的相互作用.jQuery.my 提供了全面的验证,条件格式,复杂的依赖关系,运行形式结构操作. 马 ...

  4. 火狐浏览器如何js关闭窗口的几种解决方法

    今天在项目上有一个页面要求在几秒后自动关闭,想着还比较简单,用window.close()就可以了,但是用IE/谷歌/火狐浏览器试了一下,发现IE可以,谷歌用网上的兼容方法也可以实现,但是火狐这里卡住 ...

  5. Aircrack-ng: (1) 概述

    目录 一.概述 二.工具与命令介绍 Linux命令 (1) ifconfig (2) macchanger (3) iwconfig (4) iwlist Aircrack-ng 工具 (1) air ...

  6. 初学HTML 常见的标签(三) 插入类标签

    第三篇博客, 这次说的是插入链接类标签, 我们平常在网页中经常能看到蓝色的链接类标签, 或者是一张图片, 一个电邮, 这些都是插入链接类的标签起的作用. <a></a>链接标签 ...

  7. iOS 学习 - 16.绘制虚线

    //绘制虚线 -(void)set{ UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(, , , )]; [ ...

  8. android性能优化练习:过度绘制

    练习:https://github.com/zhangbz/AndroidUIPorblems 查看过度绘制 在开发者选项中开启"调试GPU过度绘制" 判断标准 无色:没有过度绘制 ...

  9. Android 高级面试题及答案

    一 性能优化 1.如何对 Android 应用进行性能分析 android 性能主要之响应速度 和UI刷新速度. 可以参考博客:Android系统性能调优工具介绍 首先从函数的耗时来说,有一个工具Tr ...

  10. Android layout_weight理解

    layout_weight属性只能用于LinearLayout布局,不能用于RelativeLayout等其他布局: layout_weight属性如果不设定,默认值为0: layout_weight ...