这篇介绍的是对前篇目录的补充也就是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;//返回页码 }