iTextSharp.dll生成pdf 实战实例

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

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

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

 

[c-sharp:nogutter] view plaincopyprint?
  1.   
  2.  
  3. using iTextSharp.text; 
  4. using iTextSharp.text.pdf; 
  5. using System.IO; 
  6. using System.Text; 
  7. using System.Xml; 
  8.  
  9. private staticfloat bankai;//页面宽度的一半 
  10.         private staticfloat bangao;//页面高度的一半 
  11.         private staticfloat[] left = { 75, 1100 }; 
  12.         private staticfloat[] rightwidth = { 500, 675 }; 
  13.         private staticfloat[] imageWidth = { 600, 0 }; 
  14.         private staticfloat[] imgWidth = { 0, 600 }; 
  15.         private staticbool boo = true;//当目录数大于10则进行分栏 
  16.         private staticint column = 0;//0为左边1为右边 
  17.  
  18. public void CreatePDF(DataTable dt,string imagePath,string pdfPath)//第一个参数是是生成pdf所需要的内容,第二个是生成pdf所需要的图片路径,第三个是生成pdf后存放的路径 
  19.         { 
  20.             int status = 1; 
  21.             //获取图片路径 
  22.             string lift = imagePath+ @"/lift.jpg"
  23.             string right = imagePath+ @"/right.jpg"
  24.             string top1 = imagePath + @"/top1.jpg"
  25.             string top2 = imagePath + @"/top2.jpg"
  26.             Document document = new Document(iTextSharp.text.PageSize.A4, 25, 25, 25, 25);//定义pdf大小,设置上下左右边距 
  27.             Rectangle rect = new Rectangle(1190, 841);//设置整个版面的宽度和高度 
  28.             document.SetPageSize(rect); 
  29.             bankai = document.PageSize.Width / 2; 
  30.             bangao = document.PageSize.Height / 2; 
  31.             PdfWriter writer = PdfWriter.GetInstance(document,new FileStream(pdfPath + DateTime.Now.ToString("yyyyMMddhhmmss") +".pdf", FileMode.Create));//生成pdf路径,创建文件流 
  32.             document.Open(); 
  33.             PdfContentByte cb = writer.DirectContent; 
  34.             ColumnText ct = new ColumnText(cb); 
  35.             iTextSharp.text.Image img4 = iTextSharp.text.Image.GetInstance(top1);//定位背景图片1 
  36.             img4.ScalePercent(48); 
  37.             cb.AddImage(img4, bankai, 0, 0, img4.ScaledHeight, 0, 715); 
  38.             iTextSharp.text.Image img5 = iTextSharp.text.Image.GetInstance(top2);//定位背景图片2 
  39.             img5.ScalePercent(48); 
  40.             cb.AddImage(img5, img5.ScaledWidth, 0, 0, img5.ScaledHeight, 0, 683); 
  41.             Color c = new Color(int.Parse("6c423c", System.Globalization.NumberStyles.AllowHexSpecifier));//设置颜色 
  42.             BaseFont bf = BaseFont.CreateFont(@"c:/windows/fonts/SIMLI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//设置字体 
  43.             cb.Stroke(); 
  44.             cb.BeginText(); 
  45.             cb.SetFontAndSize(bf, 20); 
  46.             cb.SetColorFill(c); 
  47.             cb.SetTextMatrix(140, 610); 
  48.             cb.ShowText("卷一");//定位卷一 
  49.             cb.EndText(); 
  50.             int pagenum = 0; 
  51.             bool boo = true;//当目录数大于10则进行分栏 
  52.             bool bo = true
  53.             int newpage = 0; 
  54.             int newpageHeight = 1; 
  55.             int Count = 0; 
  56.             int PageIndex = 2; 
  57.             bool pageBool =false
  58.             //对标题数目进行判断  当目录大于左栏的时候  定位于右栏   当标题大于右栏时新建一个页面  依次循环 
  59.             for (int i = 0; i < dt.Rows.Count; i++)//当目录数目过大,对目录进行分页 
  60.             { 
  61.                 if (i != 0) 
  62.                 { 
  63.                     if (i % 10 == 0)//每一栏为10个目录 
  64.                     { 
  65.                         if (bo ==false)//当目录大于一页的时候新建一个页面 
  66.                         { 
  67.                             boo = true
  68.                             cb.Stroke(); 
  69.                             document.NewPage(); 
  70.                             newpage = -i; 
  71.                             newpageHeight = 70; 
  72.                             iTextSharp.text.Image imglift = iTextSharp.text.Image.GetInstance(lift);//定位左边的图片 
  73.                             imglift.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE; 
  74.                             cb.AddImage(imglift, 21, 0, 0, 842, 30, -22); 
  75.                         } 
  76.                         else 
  77.                         { 
  78.                             boo = false
  79.                             newpage = -i; 
  80.                         } 
  81.                     } 
  82.                 } 
  83.                 bo = boo; 
  84.                 //因为不确定标题的长度为多少 所以不能固定死  而且因为pdf里面对字体的长度有限制比如-和字符在里面的显示长度是不同的   所以根据长度来显示肯定不行了 
  85.                 //因此只能判断他们在pdf中的像素来确定他们的长度  我的办法是先获得-的像素 然后获得标题的像素  然后用总像素减去标题的像素和页码像素度再除以-的像素 
  86.                 //就得到-的个数 然后再添加到标题和页码中就可以了 
  87.                 string fuhao ="-"
  88.                 float fuhaochangdu = bf.GetWidthPoint(fuhao, (float)12);//得到-的像素 
  89.                 float biaotichangdu; 
  90.                 if (dt.Rows[i]["Title"].ToString().Length > 26)//判断目录长度是否大于30 
  91.                 { 
  92.                     string jiequTitle = dt.Rows[i]["Title"].ToString().Substring(0, 26) +"……";//大于30加...... 
  93.                     biaotichangdu = bf.GetWidthPoint(jiequTitle, (float)12);//获得标题的像素 
  94.                     cb.Stroke(); 
  95.                     cb.BeginText(); 
  96.                     cb.SetFontAndSize(bf, 12); 
  97.                     cb.SetColorFill(c); 
  98.                     if (!bo) { cb.SetTextMatrix(140 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//对标题进行定位,标题位于左栏 
  99.                     else { cb.SetTextMatrix(140, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//当标题大于左栏的时候定位于右栏 
  100.                     cb.ShowText(jiequTitle); 
  101.                     cb.EndText(); 
  102.                 } 
  103.                 else//如果标题长度大于30则添加...... 
  104.                 { 
  105.                     biaotichangdu = bf.GetWidthPoint(dt.Rows[i]["Title"].ToString(), (float)12); 
  106.                     cb.Stroke(); 
  107.                     cb.BeginText(); 
  108.                     cb.SetFontAndSize(bf, 12); 
  109.                     cb.SetColorFill(c); 
  110.                     if (!bo) { cb.SetTextMatrix(140 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//对标题进行定位 
  111.                     else { cb.SetTextMatrix(140, 530 + newpageHeight - ((i - 1 + newpage) * 50)); } 
  112.                     cb.ShowText(dt.Rows[i]["Title"].ToString());//给目录添加标题 
  113.                     string abc = dt.Rows[i]["Title"].ToString(); 
  114.                     cb.EndText(); 
  115.                 } 
  116.                 int changdu = (int)((bankai - 210 - biaotichangdu) / fuhaochangdu);//获得-的个数 
  117.                 StringBuilder sb = new StringBuilder(); 
  118.                 for (int j = 0; j < changdu; j++)//判断标题与索引之间所需要的- 
  119.                 { 
  120.  
  121.                     sb.Append(fuhao);//依次添加- 
  122.                 } 
  123.                 cb.Stroke(); 
  124.                 cb.BeginText(); 
  125.                 cb.SetFontAndSize(bf, 12); 
  126.                 cb.SetColorFill(c); 
  127.                 if (!bo) { cb.SetTextMatrix(140 + biaotichangdu + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//左栏定位- 
  128.                 else { cb.SetTextMatrix(140 + biaotichangdu, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//右栏定位- 
  129.                 cb.ShowText(sb.ToString());//给目录中间添加- 
  130.                 cb.EndText(); 
  131.                 int page = PDFPageNum(dt, i);//获得内容的页码 
  132.                 cb.Stroke(); 
  133.                 cb.BeginText(); 
  134.                 cb.SetFontAndSize(bf, 10); 
  135.                 cb.SetColorFill(c); 
  136.                 if (!bo) { cb.SetTextMatrix(bankai - 70 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//左栏定位页码 
  137.                 else { cb.SetTextMatrix(bankai - 70, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//右栏定位页码 
  138.                 cb.ShowText((PageIndex).ToString());//显示页码 
  139.                 cb.EndText(); 
  140.                 if (page == 1) { pagenum = 0; PageIndex += 2; }//给目录添加页码 
  141.                 else if (page == 2) { pagenum = 1; PageIndex += 3; } 
  142.                 else { pagenum = 1; PageIndex += page + 1; }//目录的页数 
  143.                 Color color = new Color(int.Parse("9f9fa0", System.Globalization.NumberStyles.AllowHexSpecifier)); 
  144.                 cb.Stroke(); 
  145.                 cb.BeginText(); 
  146.                 cb.SetFontAndSize(bf, 10); 
  147.                 cb.SetColorFill(color); 
  148.                 if (!bo) { cb.SetTextMatrix(140 + bankai, 510 + newpageHeight - ((i - 1 + newpage) * 50)); } 
  149.                 else { cb.SetTextMatrix(140, 505 + newpageHeight - ((i - 1 + newpage) * 50)); } 
  150.                 cb.ShowText(dt.Rows[i]["banmianming"].ToString());//给目录添加版面名称 
  151.                 cb.EndText(); 
  152.             } 
  153.             //因为我的pdf要求是先版面然后文章了   如果目录在左边的话版面就在右边了  第二页左边就为文章  右边又为版面   一次类推了  如果目录占到了右边 
  154.             //那么第二页左边为版面右边为文章了   
  155.             if (!boo)//判断目录是否生成新的页面 
  156.             { 
  157.                 column = 1; 
  158.                 pageBool = false
  159.             } 
  160.             else//没有生成页面则添加版面和页码 
  161.             { 
  162.                 iTextSharp.text.Image img6 = NewBanMianImages(dt, cb, c, bf, 0, 0); 
  163.                 cb.Stroke(); 
  164.                 cb.BeginText(); 
  165.                 cb.SetFontAndSize(bf, 11); 
  166.                 cb.SetTextMatrix(1147, 45); 
  167.                 cb.ShowText("1"); 
  168.                 cb.EndText(); 
  169.             } 

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