http://blog.csdn.net/jiangyu912/article/details/4969376
最近忙了两个星期的任务了 iTextSharp.dll是个开源的用于生成pdf的类库了 项目中我们只需要引用就可以了 说实话确实很好用 因为自己的英文水平实在有限 所以没去看API了 找资料上费了不少功夫 因为网上的资料大部分都只是介绍一些基础的应用 所以很多地方还得靠自己慢慢来摸索了 现在将自己生成的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 = { 75, 1100 };
- private static float[] rightwidth = { 500, 675 };
- private static float[] imageWidth = { 600, 0 };
- private static float[] imgWidth = { 0, 600 };
- private static bool boo = true;//当目录数大于10则进行分栏
- private static int column = 0;//0为左边1为右边
- public void CreatePDF(DataTable dt,string imagePath,string pdfPath)//第一个参数是是生成pdf所需要的内容,第二个是生成pdf所需要的图片路径,第三个是生成pdf后存放的路径
- {
- int status = 1;
- //获取图片路径
- 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, 25, 25, 25, 25);//定义pdf大小,设置上下左右边距
- Rectangle rect = new Rectangle(1190, 841);//设置整个版面的宽度和高度
- document.SetPageSize(rect);
- bankai = document.PageSize.Width / 2;
- bangao = document.PageSize.Height / 2;
- 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(48);
- cb.AddImage(img4, bankai, 0, 0, img4.ScaledHeight, 0, 715);
- iTextSharp.text.Image img5 = iTextSharp.text.Image.GetInstance(top2);//定位背景图片2
- img5.ScalePercent(48);
- cb.AddImage(img5, img5.ScaledWidth, 0, 0, img5.ScaledHeight, 0, 683);
- 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, 20);
- cb.SetColorFill(c);
- cb.SetTextMatrix(140, 610);
- cb.ShowText("卷一");//定位卷一
- cb.EndText();
- int pagenum = 0;
- bool boo = true;//当目录数大于10则进行分栏
- bool bo = true;
- int newpage = 0;
- int newpageHeight = 1;
- int Count = 0;
- int PageIndex = 2;
- bool pageBool = false;
- //对标题数目进行判断 当目录大于左栏的时候 定位于右栏 当标题大于右栏时新建一个页面 依次循环
- for (int i = 0; i < dt.Rows.Count; i++)//当目录数目过大,对目录进行分页
- {
- if (i != 0)
- {
- if (i % 10 == 0)//每一栏为10个目录
- {
- if (bo == false)//当目录大于一页的时候新建一个页面
- {
- boo = true;
- cb.Stroke();
- document.NewPage();
- newpage = -i;
- newpageHeight = 70;
- iTextSharp.text.Image imglift = iTextSharp.text.Image.GetInstance(lift);//定位左边的图片
- imglift.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE;
- cb.AddImage(imglift, 21, 0, 0, 842, 30, -22);
- }
- else
- {
- boo = false;
- newpage = -i;
- }
- }
- }
- bo = boo;
- //因为不确定标题的长度为多少 所以不能固定死 而且因为pdf里面对字体的长度有限制比如-和字符在里面的显示长度是不同的 所以根据长度来显示肯定不行了
- //因此只能判断他们在pdf中的像素来确定他们的长度 我的办法是先获得-的像素 然后获得标题的像素 然后用总像素减去标题的像素和页码像素度再除以-的像素
- //就得到-的个数 然后再添加到标题和页码中就可以了
- string fuhao = "-";
- float fuhaochangdu = bf.GetWidthPoint(fuhao, (float)12);//得到-的像素
- float biaotichangdu;
- if (dt.Rows[i]["Title"].ToString().Length > 26)//判断目录长度是否大于30
- {
- string jiequTitle = dt.Rows[i]["Title"].ToString().Substring(0, 26) + "……";//大于30加......
- biaotichangdu = bf.GetWidthPoint(jiequTitle, (float)12);//获得标题的像素
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, 12);
- cb.SetColorFill(c);
- if (!bo) { cb.SetTextMatrix(140 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//对标题进行定位,标题位于左栏
- else { cb.SetTextMatrix(140, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//当标题大于左栏的时候定位于右栏
- cb.ShowText(jiequTitle);
- cb.EndText();
- }
- else//如果标题长度大于30则添加......
- {
- biaotichangdu = bf.GetWidthPoint(dt.Rows[i]["Title"].ToString(), (float)12);
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, 12);
- cb.SetColorFill(c);
- if (!bo) { cb.SetTextMatrix(140 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//对标题进行定位
- else { cb.SetTextMatrix(140, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }
- cb.ShowText(dt.Rows[i]["Title"].ToString());//给目录添加标题
- string abc = dt.Rows[i]["Title"].ToString();
- cb.EndText();
- }
- int changdu = (int)((bankai - 210 - biaotichangdu) / fuhaochangdu);//获得-的个数
- StringBuilder sb = new StringBuilder();
- for (int j = 0; j < changdu; j++)//判断标题与索引之间所需要的-
- {
- sb.Append(fuhao);//依次添加-
- }
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, 12);
- cb.SetColorFill(c);
- if (!bo) { cb.SetTextMatrix(140 + biaotichangdu + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//左栏定位-
- else { cb.SetTextMatrix(140 + biaotichangdu, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//右栏定位-
- cb.ShowText(sb.ToString());//给目录中间添加-
- cb.EndText();
- int page = PDFPageNum(dt, i);//获得内容的页码
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, 10);
- cb.SetColorFill(c);
- if (!bo) { cb.SetTextMatrix(bankai - 70 + bankai, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//左栏定位页码
- else { cb.SetTextMatrix(bankai - 70, 530 + newpageHeight - ((i - 1 + newpage) * 50)); }//右栏定位页码
- cb.ShowText((PageIndex).ToString());//显示页码
- cb.EndText();
- if (page == 1) { pagenum = 0; PageIndex += 2; }//给目录添加页码
- else if (page == 2) { pagenum = 1; PageIndex += 3; }
- else { pagenum = 1; PageIndex += page + 1; }//目录的页数
- Color color = new Color(int.Parse("9f9fa0", System.Globalization.NumberStyles.AllowHexSpecifier));
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, 10);
- cb.SetColorFill(color);
- if (!bo) { cb.SetTextMatrix(140 + bankai, 510 + newpageHeight - ((i - 1 + newpage) * 50)); }
- else { cb.SetTextMatrix(140, 505 + newpageHeight - ((i - 1 + newpage) * 50)); }
- cb.ShowText(dt.Rows[i]["banmianming"].ToString());//给目录添加版面名称
- cb.EndText();
- }
- //因为我的pdf要求是先版面然后文章了 如果目录在左边的话版面就在右边了 第二页左边就为文章 右边又为版面 一次类推了 如果目录占到了右边
- //那么第二页左边为版面右边为文章了
- if (!boo)//判断目录是否生成新的页面
- {
- column = 1;
- pageBool = false;
- }
- else//没有生成页面则添加版面和页码
- {
- iTextSharp.text.Image img6 = NewBanMianImages(dt, cb, c, bf, 0, 0);
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, 11);
- cb.SetTextMatrix(1147, 45);
- cb.ShowText("1");
- cb.EndText();
- }
后面将对这个目录进行补充 关于其中的int page = PDFPageNum(dt, i);//获得内容的页码 方法所要做的是什么
这篇介绍的是对前篇目录的补充也就是int page = PDFPageNum(dt, i);//获得内容的页码 这个方法里面的内容 这是我做pdf后遇到的最后一个问题了 因为页面内容是变化的 我不确定每篇文章到底有多大 所以肯定不能固定死了 当初问了公司里面的高手 给的意见就是弄一个控制台程序也就是exe程序 对每篇文章大小内容进行判断然后返回一个页码 个人感觉这样太麻烦了 估计效率上肯定也会有问题 想了很久之后想到了这个办法 弄一个方法 将每篇文章按照自己生成的格式来生成 不过我生成在内存中 然后对其进行判断 生成多页就返回它的页码
- //按照自己需要生成pdf的格式生成 对其页码进行判断 返回给目录进行添加
- private int PDFPageNum(DataTable dt, int i)//获得内容的页码
- {
- int pageNum = 1;
- Document document = new Document(iTextSharp.text.PageSize.A4, 25, 25, 25, 25);
- Rectangle rect = new Rectangle(1190, 841);
- document.SetPageSize(rect);
- bankai = document.PageSize.Width / 2;//获得栏的宽度
- bangao = document.PageSize.Height / 2;//获得页面的半高
- PdfWriter writer = PdfWriter.GetInstance(document, new MemoryStream());//写入内存(重点就在这了)
- document.Open();
- PdfContentByte cb = writer.DirectContent;
- BaseFont bf = BaseFont.CreateFont(@"c:/windows/fonts/SIMLI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//设置字体
- ColumnText ct = new ColumnText(cb);
- if (dt.Rows[i]["IntroTitle"].ToString() != "")//在左栏写入引题
- {
- ct.AddText(new Paragraph(dt.Rows[i]["IntroTitle"].ToString(), BaseFontAndSize(0, 17, "9f9fa0")));
- ct.Indent = 20;
- ct.SetSimpleColumn(50, 100, 560, 760, 16, Element.ALIGN_CENTER);
- ct.Go();
- }
- ct.AddText(new Paragraph(dt.Rows[i]["Title"].ToString() + "/n", BaseFontAndSize(0, 22, "000000")));//在左栏写入标题
- ct.Indent = 20;
- ct.SetSimpleColumn(50, 100, 560, 720, 16, Element.ALIGN_CENTER);
- ct.Go();
- int subHeight = 0;
- if (dt.Rows[i]["SubTitle"].ToString() != "")
- {
- int subCount = dt.Rows[i]["SubTitle"].ToString().Length / 80;//判断字符串的长度
- ct.AddText(new Paragraph(dt.Rows[i]["SubTitle"].ToString(), BaseFontAndSize(0, 15, "9f9fa0")));//在左栏写入副题
- ct.SetSimpleColumn(50, 60, 590, 675, 16, Element.ALIGN_CENTER);
- ct.Go();
- subHeight = (subCount + 1) * 50;//加高
- }
- ct.AddText(new Paragraph(dt.Rows[i]["Author"].ToString(), BaseFontAndSize(0, 10, "000000")));//在左栏写入作者
- ct.SetSimpleColumn(0, 60, 590, 690 - subHeight, 16, Element.ALIGN_CENTER);
- ct.Go();
- int imageHeight = 0;
- int imageTwo = 0;
- int column = 0;
- bool boolNewPage = false;
- bool banmian = false;
- int newspagenum = 0;
- //文章里面可能会有多张图片 需要对其进行判断 如果图片大于一页则需要新建一页进行添加
- if (dt.Rows[i]["Image"].ToString() != "")//在左栏写入正文图片
- {
- string[] image = dt.Rows[i]["Image"].ToString().Split(',');//获取多张图片路径
- for (int j = 0; j < image.Length - 1; j++)//循环取得每张图片路径
- {
- iTextSharp.text.Image imgzhengwen = iTextSharp.text.Image.GetInstance(image[j]);//添加图片
- if (imgzhengwen.Width > bankai || imgzhengwen.Height > 690 - subHeight)//如果图片的宽和高大于栏的宽和高则对图片进行缩略,我这固定死了 正确的话应该是按照图片的实际高度进行缩略
- {
- imgzhengwen.ScalePercent(60);
- }
- imageHeight = (int)imgzhengwen.ScaledHeight;//获得图片的实际高度,因为图片可能被缩略了
- imgzhengwen.Alignment = iTextSharp.text.Image.ALIGN_CENTER;//图片居中,应该没什么用 因为采用的是绝对定位肯定会居中了
- if (banmian)//判断文章是否产生多栏
- {
- if (imageHeight + imageTwo > 720 - subHeight)//多张图片 如果图片大于右栏则新建一个页面继续添加
- {
- //因为不确定文章的大小 column为0的时候定位在左栏 column为1的时候定位在右栏
- if (column == 0) { column = 1; }
- else { column = 0; }//因为到了下一个页面 所以需要改变column的值
- if (column == 0)//因为column值本来为1也就是在右栏 当高度大于右栏的时候就需要新建一个页面继续添加了
- {
- document.NewPage();
- newspagenum += 1;
- }
- //下面这个变量存放的是每个图片的高度 因为图片定位的话是按照左边距和下边距来定位的 所以必须知道图片 标题以及副标题的高度
- imageTwo = 0;
- cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10 + imgWidth[column], 720 - imgzhengwen.ScaledHeight);
- imageTwo += imageHeight - 20;//因为这是在一篇文章里面 第二页的时候不需要标题 为了界面美观 所以高度应该往上
- banmian = false;
- }
- else//没有大于右栏的情况处理
- {
- cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10 + imgWidth[column], 720 - imgzhengwen.ScaledHeight - subHeight - imageTwo);
- imageTwo += imageHeight + 20;
- }
- }
- //文章可能只有一页也有可能有多页 不过是否产生多栏 都从左栏开始 因为前面做了判断如果产生多栏则新建一个页面
- else
- {
- if (imageHeight + imageTwo > 656 - subHeight)//判断图片是否大于左栏 如果大于则添加到右栏
- {
- //当一篇文章新建一页哦 将图片高度清空 继续添加
- if (banmian) { } else { imageTwo = 0; }
- cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10 + 600, 720 - imgzhengwen.ScaledHeight - subHeight - imageTwo);
- imageTwo += imageHeight + 20;
- banmian = true;//让下次添加到右栏
- column = 1;
- newspagenum += 1;//将页码次数加一
- }
- else//没有大于左栏就添加
- {
- cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10, 660 - imgzhengwen.ScaledHeight - subHeight - imageTwo);
- imageTwo += imageHeight + 20;
- }
- }
- }
- }
- string kongge = " ";
- float konggechangdu = bf.GetWidthPoint(kongge, (float)12);//得到-的宽度
- float banmianchangdu = bf.GetWidthPoint(dt.Rows[i]["banmianming"].ToString(), (float)12);
- StringBuilder stringBuilder = new StringBuilder();
- for (int j = 0; j < (420 - banmianchangdu) / konggechangdu; j++)
- {
- stringBuilder.Append(kongge);
- }
- ct.AddText(new Paragraph("/r" + dt.Rows[i]["Content"].ToString(), BaseFontAndSize(2, 11, "000000")));//在左栏写入正文
- ct.AddText(new Paragraph("/n/r" + stringBuilder + dt.Rows[i]["banmianming"].ToString(), BaseFontAndSize(0, 11, "6c423c")));//在左栏写入版面名称
- int status = 0;
- int pagenum = 1;
- //对内容进行判断 因为内容也会产生多栏或者多页的情况
- while ((status & ColumnText.NO_MORE_TEXT) == 0)//对内容进行判断
- {
- if (column == 1)//如果文章在右栏则新建一个页面继续添加
- {
- ct.SetSimpleColumn(rightwidth[column], 60, left[column], 720 - subHeight - imageTwo, 16, Element.ALIGN_JUSTIFIED);
- status = ct.Go();//iTextSharp里面的一个方法 如果产生分栏则返回2如果不分栏返回1
- document.NewPage();//新建一个页面
- imageTwo = 0;//图片高度清空
- }
- else//文章在左栏继续添加
- {
- //因为内容是跟在正文图片后面的 所以必须减去图片的高度 不然文字会定位在图片上
- ct.SetSimpleColumn(rightwidth[column], 60, left[column], 660 - subHeight - imageTwo, 16, Element.ALIGN_JUSTIFIED);
- status = ct.Go();
- }
- if ((status & ColumnText.NO_MORE_COLUMN) != 0)//判断是否产生第二栏
- {
- column++;
- pagenum++;
- if (column > 1)//如果column大于1则将它赋值为0 因为已经到了右栏
- {
- column = 0;
- }
- imageTwo = 0;
- }
- }
- pageNum = pagenum + newspagenum;//页码数等于正文图片产生的页码数加上内容产生的页码数 因为只有这两个才会产生多个页码
- return pageNum;//返回页码
- }
生成pdf的重点了 先看图片吧 可能会出现的情况 :
正常情况下文章和图片的排列
当文章内容大于左栏的时候
图片在左 文章在右
正文图片大于左栏甚至是右栏的情况
文字在左 图片在右
下面贴代码 代码有点多 可能某些部分还不够优化:
- int pageNum = 0;//根据是否分栏添加页数
- int newspagenum = 0;
- for (int i = 0; i < dt.Rows.Count; i++)//将所有的内容和版面进行输出
- {
- document.NewPage();//新建一个页面
- status = 0;
- if (dt.Rows[i]["IntroTitle"].ToString() != "")//在左栏写入引题
- {
- ct.AddText(new Paragraph(dt.Rows[i]["IntroTitle"].ToString(), BaseFontAndSize(0, 17, "9f9fa0")));
- ct.Indent = 20;
- ct.SetSimpleColumn(left[column], 100, rightwidth[column], 760, 16, Element.ALIGN_CENTER);
- ct.Go();
- }
- ct.AddText(new Paragraph(dt.Rows[i]["Title"].ToString() + "/n", BaseFontAndSize(0, 22, "000000")));//在左栏写入标题
- ct.Indent = 20;
- ct.SetSimpleColumn(left[column], 100, rightwidth[column], 720, 16, Element.ALIGN_CENTER);
- ct.Go();
- int subHeight = 0;
- if (dt.Rows[i]["SubTitle"].ToString() != "")
- {
- int subCount = dt.Rows[i]["SubTitle"].ToString().Length / 80;//判断字符串的长度
- ct.AddText(new Paragraph(dt.Rows[i]["SubTitle"].ToString(), BaseFontAndSize(0, 15, "9f9fa0")));//在左栏写入副题
- ct.SetSimpleColumn(left[column], 60, rightwidth[column], 675, 16, Element.ALIGN_CENTER);
- ct.Go();
- subHeight = (subCount + 1) * 50;//加高
- }
- ct.AddText(new Paragraph(dt.Rows[i]["Author"].ToString(), BaseFontAndSize(0, 10, "000000")));//在左栏写入作者
- ct.SetSimpleColumn(left[column], 60, rightwidth[column], 690 - subHeight, 16, Element.ALIGN_CENTER);
- ct.Go();
- int imageHeight = 0;
- int imageTwo = 0;
- bool banmian = false;
- bool boolNewPage = false;
- if (dt.Rows[i]["Image"].ToString() != "")//在左栏写入正文图片
- {
- string[] image = dt.Rows[i]["Image"].ToString().Split(',');
- for (int j = 0; j < image.Length - 1; j++)
- {
- iTextSharp.text.Image imgzhengwen = iTextSharp.text.Image.GetInstance(image[j]);
- if (imgzhengwen.Width > bankai || imgzhengwen.Height > 690 - subHeight)
- {
- imgzhengwen.ScalePercent(60);
- }
- imageHeight = (int)imgzhengwen.ScaledHeight;
- imgzhengwen.Alignment = iTextSharp.text.Image.ALIGN_CENTER;
- if (banmian)
- {
- if (imageHeight + imageTwo > 720 - subHeight)
- {
- if (column == 0) { column = 1; }
- else { column = 0; }
- if (column == 0)
- {
- NewPageNum(lift, cb, bf, pageNum, newspagenum, i);
- document.NewPage();
- newsPageNum += 2;
- NewPageNum(lift, cb, bf, pageNum, newspagenum, i);
- }
- imageTwo = 0;
- cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10 + imgWidth[column], 720 - imgzhengwen.ScaledHeight);
- imageTwo += imageHeight - 20;
- banmian = false;
- pageBool = true;
- }
- else
- {
- cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10 + imgWidth[column], 720 - imgzhengwen.ScaledHeight - subHeight - imageTwo);
- imageTwo += imageHeight + 20;
- }
- }
- else
- {
- if (imageHeight + imageTwo > 656 - subHeight)
- {
- if (boolNewPage)
- {
- if (pageBool)
- { NewPageNum(lift, cb, bf, pageNum, newspagenum, i); }
- else { NewPageNum(lift, cb, bf, -1, newspagenum, i); }
- document.NewPage();
- if (i == 0)
- { newsPageNum = 1; }
- else { newsPageNum += 2; }
- NewPageNum(lift, cb, bf, pageNum, newspagenum, i);
- }
- if (column == 0) { column = 1; }
- else { column = 0; }
- if (banmian) { } else { imageTwo = 0; }
- cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10 + imgWidth[column], 720 - imgzhengwen.ScaledHeight - subHeight - imageTwo);
- banmian = true;
- imageTwo = 0;
- imageTwo += imageHeight + 20;
- }
- else
- {
- if (boolNewPage) { }
- else
- {
- if (column == 1)
- {
- boolNewPage = true;
- iTextSharp.text.Image img6 = NewBanMianImages(dt, cb, c, bf, column, i);//添加版面图
- }
- }
- cb.AddImage(imgzhengwen, imgzhengwen.ScaledWidth, 0, 0, imgzhengwen.ScaledHeight, (bankai - imgzhengwen.ScaledWidth) / 2 + 10 + imgWidth[column], 660 - imgzhengwen.ScaledHeight - subHeight - imageTwo);
- imageTwo += imageHeight + 20;
- }
- }
- }
- }
- string kongge = " ";
- float konggechangdu = bf.GetWidthPoint(kongge, (float)12);//得到-的宽度
- float banmianchangdu = bf.GetWidthPoint(dt.Rows[i]["banmianming"].ToString(),(float)12);
- StringBuilder stringBuilder = new StringBuilder();
- for (int j = 0; j < (420-banmianchangdu)/konggechangdu; j++)
- {
- stringBuilder.Append(kongge);
- }
- ct.AddText(new Paragraph("/r" + dt.Rows[i]["Content"].ToString(), BaseFontAndSize(2, 11, "000000")));//在左栏写入正文
- ct.AddText(new Paragraph("/n/r" + stringBuilder + dt.Rows[i]["banmianming"].ToString(), BaseFontAndSize(0, 11, "6c423c")));//在左栏写入版面名称
- bool newbool = false;
- float[] height = { 660 - subHeight - imageTwo, 720 };
- bool newtwobool = false;
- int newpagenum = 0;
- while ((status & ColumnText.NO_MORE_TEXT) == 0)//对内容进行循环定位
- {
- if (newbool)
- {
- ct.SetSimpleColumn(left[column], 60, rightwidth[column], height[column], 16, Element.ALIGN_JUSTIFIED);
- status = ct.Go();
- }
- else
- {
- if (newtwobool)
- {
- ct.SetSimpleColumn(left[column], 60, rightwidth[column], 720, 16, Element.ALIGN_JUSTIFIED);
- status = ct.Go();
- }
- else
- {
- if (banmian)
- {
- ct.SetSimpleColumn(left[column], 60, rightwidth[column], 720 - subHeight - imageTwo, 16, Element.ALIGN_JUSTIFIED);
- status = ct.Go();
- }
- else
- {
- ct.SetSimpleColumn(left[column], 60, rightwidth[column], 660 - subHeight - imageTwo, 16, Element.ALIGN_JUSTIFIED);
- status = ct.Go();
- }
- }
- if (banmian)
- { }
- else
- {
- if (boolNewPage) { }
- else
- {
- if (column == 1)
- {
- iTextSharp.text.Image img6 = NewBanMianImages(dt, cb, c, bf, column, i);//添加版面图
- NewPageNum(lift, cb, bf, pageNum, newspagenum, i);//添加页码
- newbool = true;
- }
- }
- }
- }
- if ((status & ColumnText.NO_MORE_COLUMN) != 0)//判断内容是否需要添加到第二栏
- {
- column++;
- newbool = true;
- newpagenum++;
- if (column > 1)//如果内容超过一页则新建一个页面继续进行添加
- {
- cb.Stroke();
- NewPageNum(lift, cb, bf, pageNum, newspagenum, i);
- document.NewPage();
- column = 0;
- newspagenum += 2;
- newbool = false;
- newtwobool = true;
- }
- }
- }
- if (newbool)
- {
- }
- else
- {
- if (i + 1 == dt.Rows.Count) { }//到最后一页的时候不需要添加版面图
- else { iTextSharp.text.Image img6 = NewBanMianImages(dt, cb, c, bf, column, i + 1); }
- }
- cb.Stroke();
- NewPageNum(lift, cb, bf, pageNum, newspagenum, i);
- if (newbool)
- {
- if (newpagenum == 3)
- {
- pageNum = 0;
- }
- else if (newpagenum > 3)
- {
- pageNum++;
- }
- }
- }
- document.Close();//关闭document
- column = 0;
- newsPageNum = 0;
- }
- private static void NewPageNum(string lift, PdfContentByte cb, BaseFont bf, int pageNum, int newspagenum, int i)//添加页码
- {
- iTextSharp.text.Image imglift = iTextSharp.text.Image.GetInstance(lift);
- imglift.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE;
- cb.AddImage(imglift, 21, 0, 0, 842, 30, -22);
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, 11);
- cb.SetTextMatrix(35, 45);
- cb.ShowText((i * 2 + 2 + pageNum + newspagenum+newsPageNum).ToString());
- cb.EndText();
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, 11);
- cb.SetTextMatrix(1146, 45);
- cb.ShowText((i * 2 + 3 + pageNum + newspagenum+newsPageNum).ToString());//右侧页码
- cb.EndText();
- }
- private static iTextSharp.text.Image NewBanMianImages(DataTable dt, PdfContentByte cb,Color c,BaseFont bf,int column, int i)//添加版面
- {
- iTextSharp.text.Image img6 = iTextSharp.text.Image.GetInstance(dt.Rows[i]["LayoutPic"].ToString());//第一页右侧的版面图
- img6.ScalePercent(70);
- img6.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE;
- cb.AddImage(img6, img6.ScaledWidth, 0, 0, img6.ScaledHeight, (bankai - img6.ScaledWidth) / 2 + imageWidth[column], bangao - img6.ScaledHeight / 2 + 20);
- cb.SetLineWidth(0f);//给版面图添加边线
- cb.MoveTo((bankai - img6.ScaledWidth) / 2 + imageWidth[column], bangao - img6.ScaledHeight / 2 + img6.ScaledHeight + 20);
- cb.LineTo((bankai - img6.ScaledWidth) / 2 + imageWidth[column] + img6.ScaledWidth, bangao - img6.ScaledHeight / 2 + img6.ScaledHeight + 20);//上边框线
- cb.MoveTo((bankai - img6.ScaledWidth) / 2 + imageWidth[column], bangao - img6.ScaledHeight / 2 + img6.ScaledHeight + 20);
- cb.LineTo((bankai - img6.ScaledWidth) / 2 + imageWidth[column], bangao - img6.ScaledHeight / 2 + 20);//左边框线
- cb.MoveTo((bankai - img6.ScaledWidth) / 2 + imageWidth[column] + img6.ScaledWidth, bangao - img6.ScaledHeight / 2 + img6.ScaledHeight + 20);
- cb.LineTo((bankai - img6.ScaledWidth) / 2 + imageWidth[column] + img6.ScaledWidth, bangao - img6.ScaledHeight / 2 + 20);//右边框线
- cb.MoveTo((bankai - img6.ScaledWidth) / 2 + imageWidth[column], bangao - img6.ScaledHeight / 2 + 20);
- cb.LineTo((bankai - img6.ScaledWidth) / 2 + imageWidth[column] + img6.ScaledWidth, bangao - img6.ScaledHeight / 2 + 20);//下边框线
- cb.Stroke();
- cb.BeginText();
- cb.SetFontAndSize(bf, 11);
- cb.SetColorFill(c);
- cb.SetTextMatrix((bankai - img6.ScaledWidth) / 2 + imageWidth[column] + 200, bangao - img6.ScaledHeight / 2 - 20);
- cb.ShowText(dt.Rows[i]["banmianming"].ToString());//第一页右侧添加版面名称
- cb.EndText();
- cb.Stroke();
- return img6;
- }
- private Font BaseFontAndSize(int type, int size, string color)//设置文字的大小类型和颜色
- {
- BaseFont bf;
- Font font = null;
- Color c = new Color(int.Parse(color, System.Globalization.NumberStyles.AllowHexSpecifier));
- switch (type)
- {
- case 0:
- bf = BaseFont.CreateFont(@"c:/windows/fonts/SIMLI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//字体:黑体
- font = new Font(bf, size, Font.NORMAL, c);
- break;
- case 1:
- bf = BaseFont.CreateFont(@"c:/windows/fonts/STKAITI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//字体:楷体
- font = new Font(bf, size, Font.NORMAL, c);
- break;
- case 2:
- bf = BaseFont.CreateFont(@"c:/windows/fonts/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//字体:宋体
- font = new Font(bf, size, Font.NORMAL, c);
- break;
- }
- return font;
- }