//主要代码
//计算最大table 有多少列
List<int> clSpanNum = new List<int>();
clSpanNum.Add(subResult.Count + 5);
clSpanNum.Add(pList.Count + 5);
clSpanNum.Add(pListThree.Count + 5);
clSpanNum.Add(projectListFour.Sum(d => d.OptionNum) + 2);
int totalSpan = clSpanNum.Max(d => d);
totalSpan = totalSpan < 10 ? 10 : totalSpan;
string padfname = string.Format("综合素养报告单-{0}", sId == Service.Constant.LONG_DEFAULT ? className : className + "(" + sName + ")");
string pdfpath = "~/UploadFile/Downpdf/" + DateTime.Now.ToString("yyMMdd");
if (!System.IO.Directory.Exists(this.Server.MapPath(pdfpath)))
{
System.IO.Directory.CreateDirectory(this.Server.MapPath(pdfpath));
}
//复制模板 新pdf文件以身份证号命名(要判断新的文件是否存在)
string newPdf = Server.MapPath(string.Format("{0}/{1}.pdf", pdfpath, padfname));
if (!System.IO.File.Exists(newPdf))
{
System.IO.File.Create(newPdf).Dispose();//创建文件后一定要是否资源 不然会抛异常
}
//设置字体
BaseFont bfChinese = BaseFont.CreateFont("C:\\WINDOWS\\Fonts\\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
iTextSharp.text.Font fontChinese = new iTextSharp.text.Font(bfChinese, 12, iTextSharp.text.Font.NORMAL, iTextSharp.text.BaseColor.BLACK); //正常12号字体
iTextSharp.text.Font boldChinese = new iTextSharp.text.Font(bfChinese, 16, iTextSharp.text.Font.BOLD, iTextSharp.text.BaseColor.BLACK); //加粗16号字
iTextSharp.text.Font bbbChinese = new iTextSharp.text.Font(bfChinese, 12, iTextSharp.text.Font.BOLD, iTextSharp.text.BaseColor.BLACK);//加粗12号字
if (result.Count > 0)
{
//创建大小为A4的doc(确定标准的A4纸张的标准边距)
Document doc = new Document(PageSize.A4, 5, 5, 20, 10);
//将doc写入到新的pdf中
FileStream newfs = new FileStream(newPdf, FileMode.Create);
PdfWriter writer = PdfWriter.GetInstance(doc, newfs);
//打开doc
doc.Open();
int studentCount = result.Count;
int studentIndex = 1;
foreach (var student in result)
{
//添加标题
Paragraph Title = new Paragraph(yearName + "综合素养报告单", boldChinese);
Title.Alignment = iTextSharp.text.Rectangle.ALIGN_CENTER; //设置居中
doc.Add(Title); //将标题段加入PDF文档中
//空一行
Paragraph nullp = new Paragraph(" ", fontChinese);
nullp.Leading = 10;
doc.Add(nullp);
float[] widths = new float[totalSpan];
for (int i = 0; i < widths.Length; i++)
{
widths[i] = 0.5f;
}
#region 学生基本信息
//创建一张6列的表格
PdfPTable table = new PdfPTable(widths);//float数组中每一个数代表每一列宽度的比例
table.TotalWidth = 550f;
table.LockedWidth = true;
//开始添加单元格(添加单元格的顺序不能打乱)
//设置标题
// SetCell(table, boldChinese, yearName + "综合素养报告单", 50f, totalSpan, 0, 0);
SetCell(table, fontChinese, "班级名称", 29f, 0, 0, 0);
SetCell(table, fontChinese, student.ClassName, 29f, 3, 0, 0);
SetCell(table, fontChinese, "学生姓名", 29f, 2, 0, 0);
SetCell(table, fontChinese, student.StudentName, 29f, totalSpan - 6, 0, 0);
SetCell(table, fontChinese, "学校寄语", 100f, 0, 0, 0);
PdfPCell valueClassName = new PdfPCell(new Phrase(schoolNote, fontChinese));
valueClassName.VerticalAlignment = Element.ALIGN_MIDDLE;
valueClassName.HorizontalAlignment = Element.ALIGN_LEFT;
valueClassName.FixedHeight = 100f; //设置单元格的高度
valueClassName.Colspan = totalSpan - 1;
table.AddCell(valueClassName);
SetCell(table, fontChinese, "学期评语", 100f, 0, 0, 0);
PdfPCell teacherContent = new PdfPCell(new Phrase(student.CommentResul, fontChinese));
teacherContent.VerticalAlignment = Element.ALIGN_MIDDLE;
teacherContent.HorizontalAlignment = Element.ALIGN_LEFT;
teacherContent.FixedHeight = 100f; //设置单元格的高度
teacherContent.Colspan = totalSpan - 1;
table.AddCell(teacherContent);
doc.Add(table);
#endregion
#region 学科评价一
int clspanOne = totalSpan - (eList.Count + 5);
PdfPTable tableOne = new PdfPTable(widths);
tableOne.TotalWidth = 550f;
tableOne.LockedWidth = true;
SetCell(tableOne, fontChinese, "学科成绩评价一", 29f, 0, student.resultOne.Count + 1, 0);
SetCell(tableOne, fontChinese, "科目", 29f, 0, 0, 0);
foreach (var item in eList.OrderBy(d => d.ExamNo).ToList())
{
SetCell(tableOne, fontChinese, item.ExamName, 29f, 0, 0, 0);
}
SetCell(tableOne, fontChinese, "总评分数", 29f, 0, 0, 0);
SetCell(tableOne, fontChinese, "总评等级", 29f, 0, 0, 0);
SetCell(tableOne, fontChinese, "总评学分", 29f, clspanOne + 1, 0, 0);
int index = 1;
decimal totalScoreOne = student.resultOne.Sum(d => ZHSY.Common.ToolHelper.ConvertToDecimal(d.Score));
foreach (var p in student.resultOne)
{
SetCell(tableOne, fontChinese, p.SubjectName, 29f, 0, 0, 0);
foreach (var exam in eList.OrderBy(d => d.ExamNo))
{
string score = "";
if (exam.IsSubjoin == 0)
{
if (p.ExamInfo != null)
{
var mark = p.ExamInfo.Where(d => d.ExamId == exam.ExamId).FirstOrDefault();
score = mark != null ? mark.Score : string.Empty;
}
}
else
{
if (p.ProInfo != null)
{
var mark = p.ProInfo.Where(d => d.ProjectId == exam.ExamId).FirstOrDefault();
score = mark != null ? mark.Vlaue : string.Empty;
}
}
SetCell(tableOne, fontChinese, score, 29f, 0, 0, 0);
}
SetCell(tableOne, fontChinese, p.Sum, 29f, 0, 0, 0);
SetCell(tableOne, fontChinese, p.LevelName, 29f, 0, 0, 0);
if (index == 1)
{
SetCell(tableOne, fontChinese, totalScoreOne.ToString(), 29f, clspanOne + 1, subResult.Count + 1, 0);
index++;
}
}
doc.Add(tableOne);
#endregion
#region 学期评价二
int clspanTow = totalSpan - (pList.Count + 5);
PdfPTable tableTow = new PdfPTable(widths);
tableTow.TotalWidth = 550f;
tableTow.LockedWidth = true;
SetCell(tableTow, fontChinese, "学科成绩评价二", 29f, 0, student.resultTow.Count + 1, 0);
SetCell(tableTow, fontChinese, "科目", 29f, 0, 0, 0);
foreach (var item in pList.OrderBy(d => d.ProjectNo))
{
SetCell(tableTow, fontChinese, item.ProjectName, 29f, 0, 0, 0);
}
SetCell(tableTow, fontChinese, "总评分数", 29f, 0, 0, 0);
SetCell(tableTow, fontChinese, "总评等级", 29f, 0, 0, 0);
SetCell(tableTow, fontChinese, "总评学分", 29f, clspanTow + 1, 0, 0);
int indexTow = 1;
decimal totalScoreTow = student.resultTow.Sum(d => ZHSY.Common.ToolHelper.ConvertToDecimal(d.Score));
foreach (var p in student.resultTow)
{
SetCell(tableTow, fontChinese, p.SubjectName, 29f, 0, 0, 0);
foreach (var pj in pList.OrderBy(d => d.ProjectNo))
{
string score = "";
if (p.ProInfo != null)
{
var mark = p.ProInfo.Where(d => d.ProjectId == pj.ID).FirstOrDefault();
score = mark != null ? mark.Vlaue : string.Empty;
}
SetCell(tableTow, fontChinese, score, 29f, 0, 0, 0);
}
SetCell(tableTow, fontChinese, p.Sum, 29f, 0, 0, 0);
SetCell(tableTow, fontChinese, p.LevelName, 29f, 0, 0, 0);
if (indexTow == 1)
{
SetCell(tableTow, fontChinese, totalScoreTow.ToString(), 29f, clspanTow + 1, student.resultTow.Count, 0);
indexTow++;
}
}
doc.Add(tableTow);
#endregion
#region 拓展课程
int clspanThree = totalSpan - (pListThree.Count + 5);
PdfPTable tableThree = new PdfPTable(widths);
tableThree.TotalWidth = 550f;
tableThree.LockedWidth = true;
SetCell(tableThree, fontChinese, "拓展课程", 29f, 0, student.resultThree.Count + 2, 0);
SetCell(tableThree, fontChinese, "科目", 29f, 0, 0, 0);
foreach (var item in pListThree.OrderBy(d => d.ProjectNo))
{
SetCell(tableThree, fontChinese, item.ProjectName, 29f, 0, 0, 0);
}
SetCell(tableThree, fontChinese, "总评分数", 29f, 0, 0, 0);
SetCell(tableThree, fontChinese, "总评等级", 29f, 0, 0, 0);
SetCell(tableThree, fontChinese, "总评学分", 29f, clspanTow + 1, 0, 0);
int indexThree = 1;
decimal totalScoreThree = student.resultThree.Sum(d => ZHSY.Common.ToolHelper.ConvertToDecimal(d.Score));
if (student.resultThree != null && student.resultThree.Count > 0)
{
foreach (var p in student.resultThree)
{
SetCell(tableThree, fontChinese, p.SubjectName, 29f, 0, 0, 0);
foreach (var pj in pListThree.OrderBy(d => d.ProjectNo))
{
string score = "";
if (p.ProInfo != null)
{
var mark = p.ProInfo.Where(d => d.ProjectId == pj.ID).FirstOrDefault();
score = mark != null ? mark.Vlaue : string.Empty;
}
SetCell(tableThree, fontChinese, score, 29f, 0, 0, 0);
}
SetCell(tableThree, fontChinese, p.Sum, 29f, 0, 0, 0);
SetCell(tableThree, fontChinese, p.LevelName, 29f, 0, 0, 0);
if (indexThree == 1)
{
SetCell(tableThree, fontChinese, totalScoreThree.ToString(), 29f, clspanThree + 1, student.resultThree.Count, 0);
indexThree++;
}
}
}
else {
SetCell(tableThree, fontChinese, "", 29f, totalSpan - 1, 0, 0);
}
doc.Add(tableThree);
#endregion
#region 综合实践
decimal totalScoreFour = student.resultFour.Sum(d => ZHSY.Common.ToolHelper.ConvertToDecimal(d.Score));
int clspanFour = totalSpan - (projectListFour.Sum(d => d.OptionNum) + 2);
PdfPTable tableFour = new PdfPTable(widths);
tableFour.TotalWidth = 550f;
tableFour.LockedWidth = true;
SetCell(tableFour, fontChinese, "综合实践评价", 29f, 0, student.resultFour.Count + 3, 0);
SetCell(tableFour, fontChinese, "评价项目", 29f, projectListFour.Sum(d => d.OptionNum) + 1, 0, 0);
foreach (var item in projectListFour.OrderBy(d => d.ProjectNo))
{
SetCell(tableFour, fontChinese, item.ProjectName, 29f, item.OptionList.Count, 0, 0);
}
SetCell(tableFour, fontChinese, "总评学分", 29f, clspanTow + 2, 2, 0);
foreach (var pj in projectListFour.OrderBy(d => d.ProjectNo))
{
foreach (var p in pj.OptionList)
{
SetCell(tableFour, fontChinese, p.OptionName + "(" + p.OptionValue + ")", 29f, 0, 0, 0);
}
}
foreach (var pj in projectListFour.OrderBy(d => d.ProjectNo))
{
foreach (var p in pj.OptionList)
{
var mark = "--";
var tt = student.resultFour.Where(d => d.OptionId == p.Id).FirstOrDefault();
if (tt != null)
{
mark = tt.Score > decimal.Zero ? tt.Score.ToString() : "--";
}
SetCell(tableFour, fontChinese, mark, 29f, 0, 0, 0);
}
}
SetCell(tableFour, fontChinese, totalScoreFour.ToString(), 29f, clspanFour + 2, 0, 0);
doc.Add(tableFour);
#endregion
#region 节庆获奖
int fileFiveNum = student.fileList.Where(d => d.type == 0).Count();
decimal totalScoreFive = student.resultFive.Sum(d => ZHSY.Common.ToolHelper.ConvertToDecimal(d.Score));
int clspanFive = totalSpan - 5;
PdfPTable tableFive = new PdfPTable(widths);
tableFive.TotalWidth = 550f;
tableFive.LockedWidth = true;
SetCell(tableFive, fontChinese, "节庆获奖", 29f, 0, student.resultFive.Count + 3 + fileFiveNum + 1, 0);
SetCell(tableFive, fontChinese, "节庆名称", 29f, 2, 0, 0);
SetCell(tableFive, fontChinese, "获奖时间", 29f, 2, 0, 0);
SetCell(tableFive, fontChinese, "获奖等级", 29f, 2, 0, 0);
SetCell(tableFive, fontChinese, "折算学分", 29f, 0, 0, 0);
SetCell(tableFive, fontChinese, "总评学分", 29f, clspanFive + 1, 0, 0);
int indexFive = 1;
if (student.resultFive != null && student.resultFive.Count > 0)
{
foreach (var fl in student.resultFive)
{
SetCell(tableFive, fontChinese, fl.FestivalName, 29f, 2, 0, 0);
SetCell(tableFive, fontChinese, fl.Data, 29f, 2, 0, 0);
SetCell(tableFive, fontChinese, fl.Convert, 29f, 2, 0, 0);
SetCell(tableFive, fontChinese, fl.Score.ToString(), 29f, 0, 0, 0);
if (indexFive == 1)
{
SetCell(tableFive, fontChinese, totalScoreFive.ToString(), 29f, clspanFive + 1, student.resultFive.Count, 0);
indexFive++;
}
}
}
else
{
SetCell(tableFive, fontChinese, "", 29f, totalSpan - 1, 0, 0);
}
SetCell(tableFive, fontChinese, "获奖证书", 29f, clspanFive + 5, 0, 0);
var filefive = student.fileList.Where(d => d.type == 0).ToList();
if (filefive != null && filefive.Count > 0)
{
foreach (var fp in filefive)
{
//下面对图片进行操作
Image image = Image.GetInstance(Server.MapPath(fp.filePath));
float percentage = 1;
//这里都是图片最原始的宽度与高度
float resizedWidht = image.Width;
float resizedHeight = image.Height;
////这里用计算出来的百分比来缩小图片
image.ScalePercent(percentage * 50);
//让图片的中心点与页面的中心店进行重合
//image.SetAbsolutePosition(doc.PageSize.Width / 2 - resizedWidht / 2, doc.PageSize.Height / 2 - resizedHeight / 2);
image.ScaleToFit(200f, 230f);
image.BorderWidth = 5f;
PdfPCell imgCell = new PdfPCell(image);
imgCell.VerticalAlignment = Element.ALIGN_MIDDLE;
imgCell.HorizontalAlignment = Element.ALIGN_CENTER;
imgCell.Colspan = totalSpan - 1;
imgCell.FixedHeight = 200f;
tableFive.AddCell(imgCell);
}
}
else
{
SetCell(tableFive, fontChinese, "", 29f, totalSpan - 1, 0, 0);
}
//可以使单元格内容跨页显示
tableFive.SplitLate = false;
tableFive.SplitRows = true;
doc.Add(tableFive);
#endregion
#region 特色课程获奖
int fileSixNum = student.fileList.Where(d => d.type == 1).Count();
decimal totalScoreSix = student.resultSix.Sum(d => ZHSY.Common.ToolHelper.ConvertToDecimal(d.Score));
int clspanSix = totalSpan - 5;
PdfPTable tableSix = new PdfPTable(widths);
tableSix.TotalWidth = 550f;
tableSix.LockedWidth = true;
SetCell(tableSix, fontChinese, "特色课程获奖", 29f, 0, student.resultSix.Count + 3 + fileSixNum + 2, 0);
SetCell(tableSix, fontChinese, "获奖名称", 29f, 2, 0, 0);
SetCell(tableSix, fontChinese, "获奖时间", 29f, 2, 0, 0);
SetCell(tableSix, fontChinese, "获奖等级", 29f, 2, 0, 0);
SetCell(tableSix, fontChinese, "折算学分", 29f, 0, 0, 0);
SetCell(tableSix, fontChinese, "总评学分", 29f, clspanFive + 1, 0, 0);
int indexSix = 1;
if (student.resultSix != null && student.resultSix.Count > 0)
{
foreach (var fl in student.resultSix)
{
SetCell(tableSix, fontChinese, fl.AwardName, 29f, 2, 0, 0);
SetCell(tableSix, fontChinese, fl.Data, 29f, 2, 0, 0);
SetCell(tableSix, fontChinese, fl.Convert, 29f, 2, 0, 0);
SetCell(tableSix, fontChinese, fl.Score.ToString(), 29f, 0, 0, 0);
if (indexSix == 1)
{
SetCell(tableSix, fontChinese, totalScoreSix.ToString(), 29f, clspanSix + 1, student.resultSix.Count, 0);
indexFive++;
}
}
}
else
{
SetCell(tableSix, fontChinese, "", 29f, clspanSix + 5, 0, 0);
}
SetCell(tableSix, fontChinese, "获奖证书", 29f, clspanSix + 5, 0, 0);
var fileSix = student.fileList.Where(d => d.type == 1).ToList();
if (fileSix != null && fileSix.Count > 0)
{
foreach (var fp in fileSix)
{
//下面对图片进行操作
Image image = Image.GetInstance(Server.MapPath(fp.filePath));
float percentage = 1;
//这里都是图片最原始的宽度与高度
float resizedWidht = image.Width;
float resizedHeight = image.Height;
////这里用计算出来的百分比来缩小图片
image.ScalePercent(percentage * 50);
//让图片的中心点与页面的中心店进行重合
//image.SetAbsolutePosition(doc.PageSize.Width / 2 - resizedWidht / 2, doc.PageSize.Height / 2 - resizedHeight / 2);
image.ScaleToFit(200f, 230f);
image.BorderWidth = 5f;
PdfPCell imgCell = new PdfPCell(image);
imgCell.VerticalAlignment = Element.ALIGN_MIDDLE;
imgCell.HorizontalAlignment = Element.ALIGN_CENTER;
imgCell.Colspan = totalSpan - 1;
imgCell.FixedHeight = 200f;
tableSix.AddCell(imgCell);
}
}
else
{
SetCell(tableSix, fontChinese, "", 29f, totalSpan - 1, 0, 0);
}
doc.Add(tableSix);
#endregion
#region 家长寄语 自己期望
PdfPTable tableNote = new PdfPTable(widths);//float数组中每一个数代表每一列宽度的比例
tableNote.TotalWidth = 550f;
tableNote.LockedWidth = true;
SetCell(tableNote, fontChinese, "家长寄语及期望", 100f, 0, 0, 0);
PdfPCell noteCell1 = new PdfPCell(new Phrase("", fontChinese));
noteCell1.VerticalAlignment = Element.ALIGN_MIDDLE;
noteCell1.HorizontalAlignment = Element.ALIGN_LEFT;
noteCell1.FixedHeight = 100f; //设置单元格的高度
noteCell1.Colspan = totalSpan - 1;
tableNote.AddCell(noteCell1);
SetCell(tableNote, fontChinese, "自我评语及愿望", 100f, 0, 0, 0);
PdfPCell noteCell2 = new PdfPCell(new Phrase("", fontChinese));
noteCell2.VerticalAlignment = Element.ALIGN_MIDDLE;
noteCell2.HorizontalAlignment = Element.ALIGN_LEFT;
noteCell2.FixedHeight = 100f; //设置单元格的高度
noteCell2.Colspan = totalSpan - 1;
tableNote.AddCell(noteCell2);
tableNote.SplitLate = false;
doc.Add(tableNote);
#endregion
//每个学生相关内容写入完之后,新开一个page接着写下一个学生数据,最后一个学生结束后不需要创建page
//所以需要加判断 studentIndex != studentCount
if (studentIndex != studentCount)
{
doc.NewPage();
}
studentIndex++;
}
doc.Close();
string fileName = System.IO.Path.GetFileName(newPdf);
FileStream fs = new FileStream(newPdf, FileMode.Open);
byte[] bytes = new byte[(int)fs.Length];
fs.Read(bytes, 0, bytes.Length);
fs.Close();
return File(bytes, "application/ms-pdf", fileName);
}
public void SetCell(PdfPTable table, Font fontChinese, string cellName, float fixedHeight, int colSpan, int rowSpan, float width)
{
PdfPCell valueClassName = new PdfPCell(new Phrase(cellName, fontChinese));
valueClassName.VerticalAlignment = Element.ALIGN_MIDDLE;
valueClassName.HorizontalAlignment = Element.ALIGN_CENTER;
//设置单元格的高度 这里需要注意 如果不设置 FixedHeight,MinimumHeight 单元格文本过多时,就不会换行,并且会隐藏掉部分内容
valueClassName.FixedHeight = fixedHeight;
valueClassName.MinimumHeight = fixedHeight;
if (width > 0)
{
valueClassName.Width = width;
}
if (colSpan > 0)
{
valueClassName.Colspan = colSpan;
}
if (rowSpan > 0)
{
valueClassName.Rowspan = rowSpan;
}
table.AddCell(valueClassName);
}