wpf .netcore 导出pdf文件
PdfTableHelper.cs
public class PdfTableHelper{/// <summary>/// 表一 基本信息/// </summary>public static PdfModels Table1 { get; set; } = new();/// <summary>/// 表二 程序参数/// </summary>public static PdfModels Table2 { get; set; } = new();/// <summary>/// 第三部分 表格的集合/// </summary>public static List<PdfModels> TileTables { get; set; } = new();/// <summary>/// 标准曲线 缓存图片的地方/// </summary>public static Image Img { get; set; } = null;public static string Formula { get; set; } = null;/// <summary>/// 设置字号与字体颜色/// </summary>/// <returns></returns>static Font SetFontSizeColor(){BaseFont bfchinese = BaseFont.CreateFont("C:\\Windows\\Fonts\\msyh.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);var ChFont = new Font(bfchinese, 8, Font.NORMAL, iTextSharp.text.Color.BLACK);return ChFont;}/// <summary>/// 创建一行N列表格/// </summary>/// <param name="columnNameList">列的元素</param>/// <param name="fontSize">字号大小</param>/// <returns></returns>static PdfPTable CreateOneRowTableForTiltle(List<string> columnNameList){// 定义表格对象,参数是该表格的列数var table = new PdfPTable(columnNameList.Count){// 实现自动换页SplitLate = false,SplitRows = true};try{// 获取字号BaseFont bfchinese = BaseFont.CreateFont("C:\\Windows\\Fonts\\msyh.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);var font = new Font(bfchinese, 10, Font.NORMAL, iTextSharp.text.Color.BLACK);// 定义单元格对象PdfPCell cell;int rowCount = columnNameList.Count;for (int i = 0; i < rowCount; i++){if (columnNameList[i] == null) { columnNameList[i] = string.Empty; }if (columnNameList[i] != null){// 将内容绑定到单元格中cell = new PdfPCell(new Phrase(columnNameList[i], font)){BorderWidthLeft = 0,BorderWidthRight = 0,BorderWidthTop = 0,BorderColorLeft = iTextSharp.text.Color.WHITE,BorderColorRight = iTextSharp.text.Color.WHITE,BorderColorTop = iTextSharp.text.Color.WHITE,HorizontalAlignment = 0, // 居中PaddingBottom = 5};table.AddCell(cell);var cellBlankRow = new PdfPCell(new Phrase(" ")){FixedHeight = 5,BorderWidthLeft = 0,BorderWidthRight = 0,BorderWidthTop = 0,BorderWidthBottom = 0,BorderColorLeft = iTextSharp.text.Color.WHITE,BorderColorRight = iTextSharp.text.Color.WHITE,BorderColorTop = iTextSharp.text.Color.WHITE};table.AddCell(cellBlankRow);}}}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}return table;}/// <summary>/// 创建一行N列表格/// </summary>/// <param name="columnNameList">列的元素</param>/// <param name="fontSize">字号大小</param>/// <returns></returns>static PdfPTable CreateOneRowTable(List<string> columnNameList, bool hasLine = false){// 定义表格对象,参数是该表格的列数var table = new PdfPTable(columnNameList.Count){// 实现自动换页SplitLate = false,SplitRows = true};try{// 获取字号Font font = SetFontSizeColor();// 定义单元格对象PdfPCell cell;int rowCount = columnNameList.Count;for (int i = 0; i < rowCount; i++){if (columnNameList[i] == null) { columnNameList[i] = string.Empty; }if (columnNameList[i] != null){// 将内容绑定到单元格中cell = new PdfPCell(new Phrase(columnNameList[i], font)){HorizontalAlignment = Element.ALIGN_CENTER, // 居中VerticalAlignment = Element.ALIGN_MIDDLE // 垂直居中};if (hasLine == false){cell.Border = Rectangle.NO_BORDER; // 去掉边框}table.AddCell(cell);}}}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}return table;}/// <summary>/// 创建一行N列表格/// </summary>/// <param name="columnNameList">列的元素</param>/// <param name="fontSize">字号大小</param>/// <returns></returns>static PdfPTable CreateOneRowTableOneLeft(List<string> columnNameList, bool hasLine = false){// 定义表格对象,参数是该表格的列数var table = new PdfPTable(columnNameList.Count){// 实现自动换页SplitLate = false,SplitRows = true};try{// 获取字号Font font = SetFontSizeColor();// 定义单元格对象PdfPCell cell;int rowCount = columnNameList.Count;for (int i = 0; i < rowCount; i++){if (columnNameList[i] == null) { columnNameList[i] = string.Empty; }if (columnNameList[i] != null){if (rowCount == 1){// 将内容绑定到单元格中cell = new PdfPCell(new Phrase(columnNameList[i], font)){HorizontalAlignment = Element.ALIGN_LEFT, // 居中VerticalAlignment = Element.ALIGN_MIDDLE // 垂直居中};}else{// 将内容绑定到单元格中cell = new PdfPCell(new Phrase(columnNameList[i], font)){HorizontalAlignment = Element.ALIGN_CENTER, // 居中VerticalAlignment = Element.ALIGN_MIDDLE // 垂直居中};}if (hasLine == false){cell.Border = Rectangle.NO_BORDER; // 去掉边框}table.AddCell(cell);}}}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}return table;}/// <summary>/// 创建一行N列表格/// </summary>/// <param name="columnNameList">列的元素</param>/// <param name="fontSize">字号大小</param>/// <returns></returns>static PdfPTable CreateCellHasImg(List<string> columnNameList, bool hasLine = false){// 定义表格对象,参数是该表格的列数var table = new PdfPTable(columnNameList.Count){// 实现自动换页SplitLate = false,SplitRows = true};try{// 获取字号Font font = SetFontSizeColor();// 定义单元格对象PdfPCell cell;int rowCount = columnNameList.Count;for (int i = 0; i < rowCount; i++){if (columnNameList[i] == null) { columnNameList[i] = string.Empty; }if (columnNameList[i] != null){if (columnNameList[i].Contains("ResultImag")){string s = columnNameList[i].Substring(columnNameList[i].Length - 1);if (!string.IsNullOrEmpty(s) && int.TryParse(s, out int ispass)){ImageSource imageSource;if (ispass == 0){imageSource = (ImageSource)new ImageSourceConverter().ConvertFromString("pack://application:,,,/YouMin_MicroplateReader;component/Images/UnPass.png");}else{imageSource = (ImageSource)new ImageSourceConverter().ConvertFromString("pack://application:,,,/YouMin_MicroplateReader;component/Images/Pass.png");}// 将 ImageSource 转换为 BitmapSourceif (imageSource is System.Windows.Media.Imaging.BitmapSource bitmapSource && bitmapSource != null){using var memoryStream = new MemoryStream(); // 创建一个字节数组并将 BitmapSource 保存到该字节数组中 var encoder = new System.Windows.Media.Imaging.PngBitmapEncoder(); // 使用 PngBitmapEncoder 将 BitmapSource 保存为 PNG 格式encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(bitmapSource));encoder.Save(memoryStream);// 创建 iTextSharp 的图像byte[] byteArray = memoryStream.ToArray();var iTextImage = Image.GetInstance(byteArray);// 创建单元格并添加图像cell = new PdfPCell(iTextImage, true){FixedHeight = 5,HorizontalAlignment = Element.ALIGN_CENTER, // 居中VerticalAlignment = Element.ALIGN_MIDDLE // 垂直居中};table.AddCell(cell);}}}else{// 将内容绑定到单元格中cell = new PdfPCell(new Phrase(columnNameList[i], font)){HorizontalAlignment = Element.ALIGN_CENTER, // 居中VerticalAlignment = Element.ALIGN_MIDDLE // 垂直居中};if (hasLine == false){cell.Border = Rectangle.NO_BORDER; // 去掉边框}table.AddCell(cell);}}}}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}return table;}/// <summary>/// 用于添加行 并有一个空白行进行分隔/// </summary>/// <param name="tileTable"></param>/// <param name="linebreak"></param>/// <param name="linebreakColcount"></param>/// <returns></returns>static PdfPTable CreatePrintTable(PdfModels tileTable, bool linebreak = false, int linebreakColcount = 3, bool hasLine = false){//创建第一个表格var title = new List<string>{tileTable.TableTile};var tableMain1 = CreateOneRowTableForTiltle(title);//创建标题//创建行var tableMainrows = new List<PdfPTable>{tableMain1//把表头添加上去};try{///添加行数据if (linebreak == false){if (tileTable.Rows?.Count > 0){foreach (var item in tileTable.Rows){var rowcols = new List<string>();if (!string.IsNullOrEmpty(item.Key)){rowcols.Add(item.Key);}rowcols.AddRange(item.Value);tableMainrows.Add(CreateOneRowTable(rowcols, hasLine));}}}else//列过多换行{if (tileTable.Rows.Count > 0){var cspcount = Math.Ceiling((double)tileTable.Rows[0].Value.Count / linebreakColcount);//分次数取行for (int i = 0; i < cspcount; i++){var Skipcount = i * linebreakColcount;foreach (var item in tileTable.Rows){var rowcols = new List<string>();if (!string.IsNullOrEmpty(item.Key)){rowcols.Add(item.Key);}rowcols.AddRange(item.Value.Skip(Skipcount).Take(linebreakColcount));tableMainrows.Add(CreateOneRowTable(rowcols, hasLine));}}}}}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}var printtable = MergeMultTable(tableMainrows);return printtable;}/// <summary>/// 用于添加行 并有一个空白行进行分隔/// </summary>/// <param name="tileTable"></param>/// <param name="linebreak"></param>/// <param name="linebreakColcount"></param>/// <returns></returns>static PdfPTable CreatePrintTableOneLeft(PdfModels tileTable, bool linebreak = false, int linebreakColcount = 3, bool hasLine = false){var title = new List<string> { tileTable.TableTile }; //创建第一个表格var tableMain1 = CreateOneRowTableForTiltle(title);//创建标题//创建行var tableMainrows = new List<PdfPTable>{tableMain1//把表头添加上去};try{///添加行数据if (linebreak == false){if (tileTable.Rows?.Count > 0){foreach (var item in tileTable.Rows){var rowcols = new List<string>();if (!string.IsNullOrEmpty(item.Key)){rowcols.Add(item.Key);}rowcols.AddRange(item.Value);tableMainrows.Add(CreateOneRowTableOneLeft(rowcols, hasLine));}}}else//列过多换行{if (tileTable.Rows.Count > 0){var cspcount = Math.Ceiling((double)tileTable.Rows[0].Value.Count / linebreakColcount);//分次数取行for (int i = 0; i < cspcount; i++){var Skipcount = i * linebreakColcount;foreach (var item in tileTable.Rows){var rowcols = new List<string>();if (!string.IsNullOrEmpty(item.Key)){rowcols.Add(item.Key);}rowcols.AddRange(item.Value.Skip(Skipcount).Take(linebreakColcount));tableMainrows.Add(CreateOneRowTableOneLeft(rowcols, hasLine));}}}}}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}var printtable = MergeMultTable(tableMainrows);return printtable;}/// <summary>/// 用于添加行 并有一个空白行进行分隔/// </summary>/// <param name="tileTable"></param>/// <param name="linebreak"></param>/// <param name="linebreakColcount"></param>/// <returns></returns>static PdfPTable CreatePrintTableCellHasImg(PdfModels tileTable, bool linebreak = false, int linebreakColcount = 3, bool hasLine = false){//创建第一个表格var title = new List<string>{tileTable.TableTile};var tableMain1 = CreateOneRowTableForTiltle(title);//创建标题//创建行var tableMainrows = new List<PdfPTable>{tableMain1//把表头添加上去};try{///添加行数据if (linebreak == false){if (tileTable.Rows?.Count > 0){foreach (var item in tileTable.Rows){var rowcols = new List<string>();if (!string.IsNullOrEmpty(item.Key)){rowcols.Add(item.Key);}rowcols.AddRange(item.Value);tableMainrows.Add(CreateCellHasImg(rowcols, hasLine));}}}else//列过多换行{if (tileTable.Rows.Count > 0){var cspcount = Math.Ceiling((double)tileTable.Rows[0].Value.Count / linebreakColcount);//分次数取行for (int i = 0; i < cspcount; i++){var Skipcount = i * linebreakColcount;foreach (var item in tileTable.Rows){var rowcols = new List<string>();if (!string.IsNullOrEmpty(item.Key)){rowcols.Add(item.Key);}rowcols.AddRange(item.Value.Skip(Skipcount).Take(linebreakColcount));tableMainrows.Add(CreateCellHasImg(rowcols, hasLine));}}}}}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}var printtable = MergeMultTable(tableMainrows);return printtable;}/// <summary>/// 用于添加图片 现在只有标准曲线/// </summary>/// <param name="tileTable"></param>/// <returns></returns>static PdfPTable CreatePrintImgTable(PdfModels tileTable, Image img){try{var title1 = new List<string> { tileTable.TableTile }; //创建第一个表格 var tableMain1 = CreateOneRowTableForTiltle(title1); //创建标题List<PdfPTable> tableMainrows;if (!string.IsNullOrEmpty(Formula)){var FList = Formula.Split('\t');if (FList.Length == 2){Formula = FList[0] + "\u00A0 " + FList[1];}var title2 = new List<string> { Formula };//创建第一个表格 var tableMain2 = CreateOneRowTable(title2); //创建标题 tableMainrows = new List<PdfPTable>{tableMain1,tableMain2};//创建行把表头添加上去}else{tableMainrows = new List<PdfPTable> { tableMain1 };//创建行把表头添加上去}var printtable = MergeMultTable(tableMainrows);var cell = new PdfPCell(img, true){Border = Rectangle.NO_BORDER, // 去掉边框HorizontalAlignment = Element.ALIGN_CENTER, // 居中VerticalAlignment = Element.ALIGN_MIDDLE // 垂直居中};printtable.AddCell(cell);return printtable;}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);return null;}}public static bool WritePdf(string FileName){bool result = false;try{// 创建PDF文件using (var pdfFs = new FileStream(FileName, FileMode.Create)){var rectangle = new Rectangle(PageSize.A4);//页面大小(画出矩形轮廓) var doc = new Document(rectangle); // 获取实例doc.SetMargins(5, 5, 5, 5);//页边空白 PdfWriter.GetInstance(doc, pdfFs);// 打开pdfdoc.Open();if (Table1 != null){var printtable1 = CreatePrintTable(Table1);doc.Add(printtable1);//添加到打印对象doc.Add(GetBlankRow());}if (Table2 != null){var printtable2 = CreatePrintTable(Table2);doc.Add(printtable2);//添加到打印对象doc.Add(GetBlankRow());}if (TileTables?.Count > 0){foreach (var item in TileTables){var tmpprinttable = CreatePrintTable(item, true, item.Count, item.HasLine);doc.Add(tmpprinttable);//添加到打印对象doc.Add(GetBlankRow());}}if (Img != null){var imgTitle = new PdfModels{TableTile = Util.FindKey("StandardCurve")};var imagtable1 = CreatePrintImgTable(imgTitle, Img);if (imagtable1 != null){doc.Add(imagtable1);}}// 关闭doc.Close();}result = true;}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}return result;}public static bool WritePdfOneLeft(string FileName){bool result = false;try{// 创建PDF文件using (var pdfFs = new FileStream(FileName, FileMode.Create)){var rectangle = new Rectangle(PageSize.A4);//页面大小(画出矩形轮廓)// 获取实例var doc = new Document(rectangle);doc.SetMargins(10, 10, 10, 10);//页边空白 PdfWriter.GetInstance(doc, pdfFs);// 打开pdfdoc.Open();if (Table1 != null){var printtable1 = CreatePrintTableOneLeft(Table1);doc.Add(printtable1);//添加到打印对象doc.Add(GetBlankRow());}if (Table2 != null){var printtable2 = CreatePrintTableOneLeft(Table2);doc.Add(printtable2);//添加到打印对象doc.Add(GetBlankRow());}if (TileTables?.Count > 0){foreach (var item in TileTables){var tmpprinttable = CreatePrintTableOneLeft(item, true, item.Count, item.HasLine);doc.Add(tmpprinttable);//添加到打印对象doc.Add(GetBlankRow());}}if (Img != null){var imgTitle = new PdfModels{TableTile = Util.FindKey("StandardCurve")};var imagtable1 = CreatePrintImgTable(imgTitle, Img);if (imagtable1 != null){doc.Add(imagtable1);}}// 关闭doc.Close();}result = true;}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}return result;}public static bool WritePdfCellHasImg(string FileName){bool result = false;try{// 创建PDF文件using (var pdfFs = new FileStream(FileName, FileMode.Create)){var rectangle = new Rectangle(PageSize.A4);//页面大小(画出矩形轮廓)// 获取实例var doc = new Document(rectangle);doc.SetMargins(10, 10, 10, 10);//页边空白 PdfWriter.GetInstance(doc, pdfFs);// 打开pdfdoc.Open();if (Table1 != null){var printtable1 = CreatePrintTable(Table1);doc.Add(printtable1);//添加到打印对象doc.Add(GetBlankRow());}if (Table2 != null){var printtable2 = CreatePrintTable(Table2);doc.Add(printtable2);//添加到打印对象doc.Add(GetBlankRow());}if (TileTables?.Count > 0){foreach (var item in TileTables){var tmpprinttable = CreatePrintTableCellHasImg(item, true, item.Count, item.HasLine);doc.Add(tmpprinttable);//添加到打印对象doc.Add(GetBlankRow());}}if (Img != null){var imgTitle = new PdfModels{TableTile = Util.FindKey("StandardCurve")};var imagtable1 = CreatePrintImgTable(imgTitle, Img);if (imagtable1 != null){doc.Add(imagtable1);}}// 关闭doc.Close();}result = true;}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}return result;}public static void WritePdfForOne(string path){try{using var pdfFs = new FileStream(path, FileMode.Create);// 创建PDF文件 var doc = new Document(); // 获取实例PdfWriter.GetInstance(doc, pdfFs);// 打开pdfdoc.Open();if (TileTables?.Count > 0){foreach (var item in TileTables){var tmpprinttable = CreatePrintTable(item, true, 8);doc.Add(tmpprinttable);//添加到打印对象}}// 关闭doc.Close();}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}}/// <summary>/// 生成默认空白行/// </summary>/// <returns></returns>public static Paragraph GetBlankRow(){var blankRow = new Paragraph(" ", SetFontSizeColor());//设置字号大小和样式blankRow.SetAlignment(Element.ALIGN_CENTER.ToString());blankRow.SetLeading(10, 0);//行间距return blankRow;}/// <summary>/// 合并两个表格/// </summary>/// <param name="table1"></param>/// <param name="table2"></param>/// <returns></returns>public static PdfPTable MergeTwoTable(PdfPTable table1, PdfPTable table2){var table = new PdfPTable(1) // 定义表格对象,参数代表是该表格一共由多少列{// 实现自动换页SplitLate = false,SplitRows = true};try{PdfPCell cell;// 定义单元格对象// 这个函数写死是合并两个单元格int rowCount = 2;for (int i = 0; i < rowCount; i++){switch (i){case 0:// 单元格中添加表格1cell = new PdfPCell(table1){// 居中Padding = 0};// 将单元格添加到表格中table.AddCell(cell);break;case 1:cell = new PdfPCell(table2){Padding = 0};table.AddCell(cell);break;default:break;}}}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}// 最后将合并好的表格返回return table;}/// <summary>/// 合并多个表格/// </summary>/// <param name="pdfList"></param>/// <returns></returns>public static PdfPTable MergeMultTable(List<PdfPTable> pdfList){var table = new PdfPTable(1){SplitLate = false,SplitRows = true};try{PdfPCell cell;// 将表格绑定到单元格中,然后将单元格插入汇总表格if (pdfList != null && pdfList.Any()){foreach (PdfPTable pdf in pdfList){cell = new PdfPCell(pdf){Border = Rectangle.NO_BORDER, // 去掉边框HorizontalAlignment = Element.ALIGN_CENTER, // 居中VerticalAlignment = Element.ALIGN_MIDDLE, // 垂直居中Padding = 0};table.AddCell(cell);}}}catch (Exception ex){LogHelper.GetSingleObj().WriteLog(ex);}return table;}}
PdfModels.cs
public partial class PdfModels : ObservableObject{public PdfModels() { Rows = new List<KeyValuePair<string, List<string>>>(); }/// <summary>/// 表格标题/// </summary>public string TableTile { get; set; } = string.Empty;public int Count { get; set; } = 12;public bool HasLine { get; set; } = false;public List<KeyValuePair<string, List<string>>> Rows { get; set; }}
方法里的实现
using var folderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog();if (folderBrowserDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK){var selectedPath = folderBrowserDialog.SelectedPath;//注册编码提供程序 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);PdfTableHelper.TileTables = new List<PdfModels>();PdfTableHelper.Formula = null;PdfTableHelper.Img = null;string FileName = Path.Combine(selectedPath, $"{xxxx}.pdf");var fi = new FileInfo(FileName);if (fi.Directory != null && !fi.Directory.Exists){fi.Directory.Create();}if (File.Exists(FileName)){Application.Current.Dispatcher.Invoke(() =>{if (new IsDeleteWin("HasFile").ShowDialog() == false){return;}});}PdfTableHelper.Table1 = new PdfModels();PdfTableHelper.Table2 = new PdfModels();PdfTableHelper.TileTables = new List<PdfModels>();//构造第一个表格PdfTableHelper.Table1.TableTile = Util.FindKey("BaseInformation");PdfTableHelper.Table1.Rows = new List<KeyValuePair<string, List<string>>>(){new KeyValuePair<string, List<string>>("111",new List<string>(){111}),new KeyValuePair<string, List<string>>("222",new List<string>(){ 222 })};//构造第二个表格PdfTableHelper.Table2.TableTile = Util.FindKey("ProgramParameters");PdfTableHelper.Table2.Rows = new List<KeyValuePair<string, List<string>>>();PdfTableHelper.Table2.Rows.Add(new KeyValuePair<string, List<string>>("333"), new List<string>() { "333" }));model = new PdfModels(){TableTile = xxx};model.Rows.Add(new KeyValuePair<string, List<string>>("444"),new List<string>() { "1", "2", "3", "4", "5", "6" }));foreach (var Temp in TempList){model.Rows.Add(new KeyValuePair<string,List<string>>(Temp.Hole, new List<string>(){Temp.111,Temp.222,Temp.333,Temp.444,Temp.555,Temp.666}));}PdfTableHelper.TileTables.Add(model);PdfTableHelper.WritePdf(FileName);}