NewGaoKaoApi/PDFGenerateApi/PdfOptHelper.cs

244 lines
11 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using static System.Net.Mime.MediaTypeNames;
using iText.Kernel.Pdf;
using iText.Kernel.Geom;
using iText.IO.Image;
using iText.Layout.Element;
using Image = iText.Layout.Element.Image;
using iText.Layout.Properties;
using iText.Layout;
using iText.Kernel.Font;
using iText.IO.Font;
using iText.Kernel.Colors;
namespace PDFGenerateApi
{
public class PdfOptHelper
{
/// <summary>
///
/// </summary>
/// <param name="pagetitle"></param>
/// <param name="headers"></param>
/// <param name="dataModels"></param>
/// <returns></returns>
public static MemoryStream CreatePdf(string fontsPath, string pagetitle, List<string> headers, List<dataModel> dataModels)
{
// 创建内存流
using (var stream = new MemoryStream())
{
// 创建 PDF Writer
PdfWriter writer = new PdfWriter(stream);
PdfDocument pdf = new PdfDocument(writer);
// 设置页面大小为横向 A4
PageSize pageSize = PageSize.A4.Rotate();
// 设置页面大小为 A4
pdf.SetDefaultPageSize(pageSize);
Document document = new Document(pdf);
//if (!File.Exists(fontsPath))
//{
// bool aa = true;
// // _logger.LogError($"Font file not found at path: {fontsPath}");
// // return NotFound("Font file not found.");
//}
PdfFont font = PdfFontFactory.CreateFont(fontsPath, PdfEncodings.IDENTITY_H, PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);
// 加载 logo 图像
string logoPath = "https://i5.youzy.cn/util4y/media/files/20231026/7840b6f1f30c413eade15babc70be26e_%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20230811154443.png"; // 确保 logo.png 放在 wwwroot 目录下
ImageData imageData = ImageDataFactory.Create(logoPath);
Image logo = new Image(imageData);
logo.SetWidth(124);
logo.SetHeight(40);
// 将 logo 添加到文档中
document.Add(logo);
Paragraph title = CreateTitle(font, pagetitle);
document.Add(title);
// 添加标题下方内容
Paragraph subtitle = CreateSubTitle(font, string.Format("最后修改时间:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm")));
document.Add(subtitle);
// 添加表头
// string[] unversityheaders = { "志愿", "概率", "院校代码", "院校名称", "24招生计划", "历年", "2023", "2022", "2021" };
Table universitytable = HeaderTable(font, 9, headers, new List<dataModel>() { });
document.Add(universitytable);
#region ***********写入表格
// 创建一个 8列的表格设置表格宽度为 100% 以适应页面宽度
// Table universitytable = new Table(9);
// universitytable.SetWidth(UnitValue.CreatePercentValue(100));
//int h = 0;
//foreach (var header in unversityheaders)
//{
// h++;
// if (h == 4)
// {
// universitytable.AddHeaderCell(new Cell().Add(new Paragraph(header).SetWidth(85).SetFont(font).SetBold().SetTextAlignment(TextAlignment.CENTER)));
// }
// else
// {
// universitytable.AddHeaderCell(new Cell().Add(new Paragraph(header).SetFont(font).SetBold().SetTextAlignment(TextAlignment.CENTER)));
// }
//}
//// 可选:添加表格数据,这里仅作为示例
//for (int i = 1; i <= 1; i++)
//{
// universitytable.AddCell(new Cell().Add(new Paragraph(i.ToString()).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// universitytable.AddCell(new Cell().Add(new Paragraph("0.9").SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// universitytable.AddCell(new Cell().Add(new Paragraph("A999").SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// universitytable.AddCell(new Cell().Add(new Paragraph("山东师范大学(本科)(山东公办)省重点 保研 研究生院 省部共建山东 济南市/综合/公办/排名190" + i).SetWidth(85).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// universitytable.AddCell(new Cell().Add(new Paragraph("100").SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// universitytable.AddCell(new Cell().Add(new Paragraph("历史数据" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// universitytable.AddCell(new Cell().Add(new Paragraph("2023数据" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// universitytable.AddCell(new Cell().Add(new Paragraph("2022数据" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// universitytable.AddCell(new Cell().Add(new Paragraph("2021数据" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
//}
//document.Add(universitytable);
//// float[] columnWidths = { 0.5f, 0.5f, 1, 2, 1, 1, 1, 1, 1 };
//Table majortable = new Table(9);
//majortable.SetWidth(UnitValue.CreatePercentValue(100));
//// 添加表头
//string[] majorlistheaders = { "序号", "概率", "专业代码", "专业名称", "24招生计划", "历年", "2023", "2022", "2021" };
//foreach (var header in majorlistheaders)
//{
// majortable.AddHeaderCell(new Cell().Add(new Paragraph(header).SetFont(font).SetBold().SetTextAlignment(TextAlignment.CENTER)));
//}
//for (int i = 1; i <= 5; i++)
//{
// majortable.AddCell(new Cell().Add(new Paragraph(i.ToString()).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// majortable.AddCell(new Cell().Add(new Paragraph("0.9").SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// majortable.AddCell(new Cell().Add(new Paragraph("QL").SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// majortable.AddCell(new Cell().Add(new Paragraph("垫子信息技术" + i).SetWidth(85).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// majortable.AddCell(new Cell().Add(new Paragraph("20").SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// majortable.AddCell(new Cell().Add(new Paragraph("录取人数\n计划人数\n最低分\n最低位次\n效位差" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// majortable.AddCell(new Cell().Add(new Paragraph("2023数据" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// majortable.AddCell(new Cell().Add(new Paragraph("2022数据" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
// majortable.AddCell(new Cell().Add(new Paragraph("2021数据" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
//}
//document.Add(majortable);
#endregion
// 将表格添加到文档中
// 关闭文档
document.Close();
// 返回 PDF 文件
return stream;
}
}
/// <summary>
/// 标题
/// </summary>
/// <param name="font"></param>
/// <param name="titletext"></param>
/// <returns></returns>
private static Paragraph CreateTitle(PdfFont font, string titletext)
{
Paragraph title = new Paragraph(titletext)
.SetTextAlignment(TextAlignment.CENTER)
.SetFont(font)
.SetBold()
.SetFontSize(16)
.SetMarginTop(20)
.SetMarginBottom(5);
return title;
}
/// <summary>
/// 创建副标
/// </summary>
/// <param name="font"></param>
/// <param name="titletext"></param>
/// <returns></returns>
private static Paragraph CreateSubTitle(PdfFont font, string titletext)
{
Paragraph title = new Paragraph(titletext)
.SetTextAlignment(TextAlignment.CENTER)
.SetFont(font)
.SetFontColor(ColorConstants.GRAY) // 设置字体颜色为灰色
.SetFontSize(12)
.SetMarginBottom(20);
return title;
}
/// <summary>
/// table表头
/// </summary>
/// <param name="tb"></param>
/// <param name="headers"></param>
/// <returns></returns>
private static Table HeaderTable(PdfFont font, int tb, List<string> headers, List<dataModel> dataList)
{
Table table = new Table(tb);
table.SetWidth(UnitValue.CreatePercentValue(100));
int h = 0;
foreach (var header in headers)
{
h++;
if (h == 4)
{
table.AddHeaderCell(new Cell().Add(new Paragraph(header).SetWidth(85).SetFont(font).SetBold().SetTextAlignment(TextAlignment.CENTER)));
}
else
{
table.AddHeaderCell(new Cell().Add(new Paragraph(header).SetFont(font).SetBold().SetTextAlignment(TextAlignment.CENTER)));
}
}
dataList.ForEach(a =>
{
table.AddCell(new Cell().Add(new Paragraph(a.id.ToString()).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
table.AddCell(new Cell().Add(new Paragraph(a.probability).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
table.AddCell(new Cell().Add(new Paragraph(a.universityCode).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
table.AddCell(new Cell().Add(new Paragraph(a.universityName).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
table.AddCell(new Cell().Add(new Paragraph(a.planName).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
table.AddCell(new Cell().Add(new Paragraph(a.history).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
a.years.ForEach(a =>
{
table.AddCell(new Cell().Add(new Paragraph(a).SetFont(font).SetTextAlignment(TextAlignment.CENTER)));
});
});
return table;
}
public class dataModel
{
public int id { get; set; }
/// <summary>
///
/// </summary>
public string probability { get; set; }
/// <summary>
///
/// </summary>
public string universityCode { get; set; }
/// <summary>
///
/// </summary>
public string universityName { get; set; }
public string planName { get; set; }
public string history { get; set; }
public List<string> years { get; set; }
}
}
}