from:https://blog.csdn.net/plean/article/details/8097015

最近忙了两个星期的任务了     iTextSharp.dll是个开源的用于生成pdf的类库了  项目中我们只需要引用就可以了    说实话确实很好用   因为自己的英文水平实在有限    所以没去看API了   找资料上费了不少功夫    因为网上的资料大部分都只是介绍一些基础的应用   所以很多地方还得靠自己慢慢来摸索了    现在将自己生成的pdf代码奉献给大家   希望对有用到的朋友一些帮助   给的代码中有些属性和方法不明白的需要大家自己去找资料参考了    代码里面就不解释了

代码量有一些   可能还不是很完善  毕竟自己的能力还是很有限   所以代码部分还有一些需要优化    不过生成是没问题的   就当给大家参考吧   当然有高人提些意见还是很不错的

先看图片吧 我需要生成的pdf是什么样的:

先看图片吧 我需要生成的pdf是什么样的:


using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using System.Text;
using System.Xml; private static float bankai;//页面宽度的一半
private static float bangao;//页面高度的一半
private static float[] left = { , };
private static float[] rightwidth = { , };
private static float[] imageWidth = { , };
private static float[] imgWidth = { , };
private static bool boo = true;//当目录数大于10则进行分栏
private static int column = ;//0为左边1为右边 public void CreatePDF(DataTable dt,string imagePath,string pdfPath)//第一个参数是是生成pdf所需要的内容,第二个是生成pdf所需要的图片路径,第三个是生成pdf后存放的路径
{
int status = ;
//获取图片路径
string lift = imagePath+ @"/lift.jpg";
string right = imagePath+ @"/right.jpg";
string top1 = imagePath + @"/top1.jpg";
string top2 = imagePath + @"/top2.jpg";
Document document = new Document(iTextSharp.text.PageSize.A4, , , , );//定义pdf大小,设置上下左右边距
Rectangle rect = new Rectangle(, );//设置整个版面的宽度和高度
document.SetPageSize(rect);
bankai = document.PageSize.Width / ;
bangao = document.PageSize.Height / ;
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(pdfPath + DateTime.Now.ToString("yyyyMMddhhmmss") + ".pdf", FileMode.Create));//生成pdf路径,创建文件流
document.Open();
PdfContentByte cb = writer.DirectContent;
ColumnText ct = new ColumnText(cb);
iTextSharp.text.Image img4 = iTextSharp.text.Image.GetInstance(top1);//定位背景图片1
img4.ScalePercent();
cb.AddImage(img4, bankai, , , img4.ScaledHeight, , );
iTextSharp.text.Image img5 = iTextSharp.text.Image.GetInstance(top2);//定位背景图片2
img5.ScalePercent();
cb.AddImage(img5, img5.ScaledWidth, , , img5.ScaledHeight, , );
Color c = new Color(int.Parse("6c423c", System.Globalization.NumberStyles.AllowHexSpecifier));//设置颜色
BaseFont bf = BaseFont.CreateFont(@"c:/windows/fonts/SIMLI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//设置字体
cb.Stroke();
cb.BeginText();
cb.SetFontAndSize(bf, );
cb.SetColorFill(c);
cb.SetTextMatrix(, );
cb.ShowText("卷一");//定位卷一
cb.EndText();
int pagenum = ;
bool boo = true;//当目录数大于10则进行分栏
bool bo = true;
int newpage = ;
int newpageHeight = ;
int Count = ;
int PageIndex = ;
bool pageBool = false;
//对标题数目进行判断 当目录大于左栏的时候 定位于右栏 当标题大于右栏时新建一个页面 依次循环
for (int i = ; i < dt.Rows.Count; i++)//当目录数目过大,对目录进行分页
{
if (i != )
{
if (i % == )//每一栏为10个目录
{
if (bo == false)//当目录大于一页的时候新建一个页面
{
boo = true;
cb.Stroke();
document.NewPage();
newpage = -i;
newpageHeight = ;
iTextSharp.text.Image imglift = iTextSharp.text.Image.GetInstance(lift);//定位左边的图片
imglift.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE;
cb.AddImage(imglift, , , , , , -);
}
else
{
boo = false;
newpage = -i;
}
}
}
bo = boo;
//因为不确定标题的长度为多少 所以不能固定死 而且因为pdf里面对字体的长度有限制比如-和字符在里面的显示长度是不同的 所以根据长度来显示肯定不行了
//因此只能判断他们在pdf中的像素来确定他们的长度 我的办法是先获得-的像素 然后获得标题的像素 然后用总像素减去标题的像素和页码像素度再除以-的像素
//就得到-的个数 然后再添加到标题和页码中就可以了
string fuhao = "-";
float fuhaochangdu = bf.GetWidthPoint(fuhao, (float));//得到-的像素
float biaotichangdu;
if (dt.Rows[i]["Title"].ToString().Length > )//判断目录长度是否大于30
{
string jiequTitle = dt.Rows[i]["Title"].ToString().Substring(, ) + "……";//大于30加......
biaotichangdu = bf.GetWidthPoint(jiequTitle, (float));//获得标题的像素
cb.Stroke();
cb.BeginText();
cb.SetFontAndSize(bf, );
cb.SetColorFill(c);
if (!bo) { cb.SetTextMatrix( + bankai, + newpageHeight - ((i - + newpage) * )); }//对标题进行定位,标题位于左栏
else { cb.SetTextMatrix(, + newpageHeight - ((i - + newpage) * )); }//当标题大于左栏的时候定位于右栏
cb.ShowText(jiequTitle);
cb.EndText();
}
else//如果标题长度大于30则添加......
{
biaotichangdu = bf.GetWidthPoint(dt.Rows[i]["Title"].ToString(), (float));
cb.Stroke();
cb.BeginText();
cb.SetFontAndSize(bf, );
cb.SetColorFill(c);
if (!bo) { cb.SetTextMatrix( + bankai, + newpageHeight - ((i - + newpage) * )); }//对标题进行定位
else { cb.SetTextMatrix(, + newpageHeight - ((i - + newpage) * )); }
cb.ShowText(dt.Rows[i]["Title"].ToString());//给目录添加标题
string abc = dt.Rows[i]["Title"].ToString();
cb.EndText();
}
int changdu = (int)((bankai - - biaotichangdu) / fuhaochangdu);//获得-的个数
StringBuilder sb = new StringBuilder();
for (int j = ; j < changdu; j++)//判断标题与索引之间所需要的-
{ sb.Append(fuhao);//依次添加-
}
cb.Stroke();
cb.BeginText();
cb.SetFontAndSize(bf, );
cb.SetColorFill(c);
if (!bo) { cb.SetTextMatrix( + biaotichangdu + bankai, + newpageHeight - ((i - + newpage) * )); }//左栏定位-
else { cb.SetTextMatrix( + biaotichangdu, + newpageHeight - ((i - + newpage) * )); }//右栏定位-
cb.ShowText(sb.ToString());//给目录中间添加-
cb.EndText();
int page = PDFPageNum(dt, i);//获得内容的页码
cb.Stroke();
cb.BeginText();
cb.SetFontAndSize(bf, );
cb.SetColorFill(c);
if (!bo) { cb.SetTextMatrix(bankai - + bankai, + newpageHeight - ((i - + newpage) * )); }//左栏定位页码
else { cb.SetTextMatrix(bankai - , + newpageHeight - ((i - + newpage) * )); }//右栏定位页码
cb.ShowText((PageIndex).ToString());//显示页码
cb.EndText();
if (page == ) { pagenum = ; PageIndex += ; }//给目录添加页码
else if (page == ) { pagenum = ; PageIndex += ; }
else { pagenum = ; PageIndex += page + ; }//目录的页数
Color color = new Color(int.Parse("9f9fa0", System.Globalization.NumberStyles.AllowHexSpecifier));
cb.Stroke();
cb.BeginText();
cb.SetFontAndSize(bf, );
cb.SetColorFill(color);
if (!bo) { cb.SetTextMatrix( + bankai, + newpageHeight - ((i - + newpage) * )); }
else { cb.SetTextMatrix(, + newpageHeight - ((i - + newpage) * )); }
cb.ShowText(dt.Rows[i]["banmianming"].ToString());//给目录添加版面名称
cb.EndText();
}
//因为我的pdf要求是先版面然后文章了 如果目录在左边的话版面就在右边了 第二页左边就为文章 右边又为版面 一次类推了 如果目录占到了右边
//那么第二页左边为版面右边为文章了
if (!boo)//判断目录是否生成新的页面
{
column = ;
pageBool = false;
}
else//没有生成页面则添加版面和页码
{
iTextSharp.text.Image img6 = NewBanMianImages(dt, cb, c, bf, , );
cb.Stroke();
cb.BeginText();
cb.SetFontAndSize(bf, );
cb.SetTextMatrix(, );
cb.ShowText("");
cb.EndText();
}

后面将对这个目录进行补充   关于其中的int page = PDFPageNum(dt, i);//获得内容的页码  方法所要做的是什么

最新文章

  1. csharp: ODP.NET,System.Data.OracleClient(.net 4.0) and System.Data.OleDb读取Oracle g 11.2.0的区别
  2. 第19章 集合框架(3)-Map接口
  3. 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
  4. ue4 c++ 接口
  5. ssh隧道(端口转发)
  6. python--&gt;基础--&gt;001--&gt;基本模块使用汇总
  7. 使用CSS创建有图标的网站导航菜单
  8. 2015最新百度搜索引擎(seo优化)排名算法
  9. SQL 增加或删除一列
  10. Python每隔一秒钟打印当地时间
  11. 解决Eclipse无法添加Tomcat服务器的问题
  12. Unity中的万能对象池
  13. dojo中的dojox/grid/EnhancedGrid表格报错
  14. java.io.FileNotFoundException: ..\lib\commons-el.jar
  15. journalctl 清理journal日志
  16. Expo大作战(二十三)--expo中expo kit 高级属性(没干货)
  17. [转]C++ template —— 模板基础(一)
  18. 1067 - Combinations---LightOj(Lucas求组合数)
  19. 30:最小的K个数
  20. SQL高效分页(百万条数据)

热门文章

  1. 题解 洛谷P4872 【OIer们的东方梦】
  2. 「NOI2012」迷失游乐园
  3. .net框架-字典对象 Hashtable &amp; Dictionary&lt;TKey,TValue&gt; &amp; SortedList
  4. 使用C#的HttpWebRequest模拟登陆访问人人网(转)
  5. 一文读懂后缀自动机 Suffix_Automata
  6. LightOJ - 1410 - Consistent Verdicts(规律)
  7. NOIP2013积木大赛 [贪心]
  8. BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT
  9. easyui增删改查
  10. MATLAB曲线拟合函数