PdfTableHelper.cs
public class PdfTableHelper
{
///
/// 表一 基本信息
///
public static PdfModels Table1 { get; set; } = new();
///
/// 表二 程序参数
///
public static PdfModels Table2 { get; set; } = new();
///
/// 第三部分 表格的集合
///
public static List TileTables { get; set; } = new();
///
/// 标准曲线 缓存图片的地方
///
public static Image Img { get; set; } = null;
public static string Formula { get; set; } = null;
///
/// 设置字号与字体颜色
///
///
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;
}
///
/// 创建一行N列表格
///
/// 列的元素
/// 字号大小
///
static PdfPTable CreateOneRowTableForTiltle(List 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
/// 创建一行N列表格
///
/// 列的元素
/// 字号大小
///
static PdfPTable CreateOneRowTable(List 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
/// 创建一行N列表格
///
/// 列的元素
/// 字号大小
///
static PdfPTable CreateOneRowTableOneLeft(List 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
/// 创建一行N列表格
///
/// 列的元素
/// 字号大小
///
static PdfPTable CreateCellHasImg(List 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
/// 用于添加行 并有一个空白行进行分隔
///
///
///
///
///
static PdfPTable CreatePrintTable(PdfModels tileTable, bool linebreak = false, int linebreakColcount = 3, bool hasLine = false)
{
//创建第一个表格
var title = new List
{
tileTable.TableTile
};
var tableMain1 = CreateOneRowTableForTiltle(title);//创建标题
//创建行
var tableMainrows = new List
{
tableMain1//把表头添加上去
};
try
{
///添加行数据
if (linebreak == false)
{
if (tileTable.Rows?.Count > 0)
{
foreach (var item in tileTable.Rows)
{
var rowcols = new List();
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 ();
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;
}
///
/// 用于添加行 并有一个空白行进行分隔
///
///
///
///
///
static PdfPTable CreatePrintTableOneLeft(PdfModels tileTable, bool linebreak = false, int linebreakColcount = 3, bool hasLine = false)
{
var title = new List { tileTable.TableTile }; //创建第一个表格
var tableMain1 = CreateOneRowTableForTiltle(title);//创建标题
//创建行
var tableMainrows = new List
{
tableMain1//把表头添加上去
};
try
{
///添加行数据
if (linebreak == false)
{
if (tileTable.Rows?.Count > 0)
{
foreach (var item in tileTable.Rows)
{
var rowcols = new List();
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 ();
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;
}
///
/// 用于添加行 并有一个空白行进行分隔
///
///
///
///
///
static PdfPTable CreatePrintTableCellHasImg(PdfModels tileTable, bool linebreak = false, int linebreakColcount = 3, bool hasLine = false)
{
//创建第一个表格
var title = new List
{
tileTable.TableTile
};
var tableMain1 = CreateOneRowTableForTiltle(title);//创建标题
//创建行
var tableMainrows = new List
{
tableMain1//把表头添加上去
};
try
{
///添加行数据
if (linebreak == false)
{
if (tileTable.Rows?.Count > 0)
{
foreach (var item in tileTable.Rows)
{
var rowcols = new List();
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 ();
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;
}
///
/// 用于添加图片 现在只有标准曲线
///
///
///
static PdfPTable CreatePrintImgTable(PdfModels tileTable, Image img)
{
try
{
var title1 = new List { tileTable.TableTile }; //创建第一个表格
var tableMain1 = CreateOneRowTableForTiltle(title1); //创建标题
List tableMainrows;
if (!string.IsNullOrEmpty(Formula))
{
var FList = Formula.Split('\t');
if (FList.Length == 2)
{
Formula = FList[0] + "\u00A0 " + FList[1];
}
var title2 = new List { Formula };//创建第一个表格
var tableMain2 = CreateOneRowTable(title2); //创建标题
tableMainrows = new List
{
tableMain1,
tableMain2
};//创建行把表头添加上去
}
else
{
tableMainrows = new List { 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);
// 打开pdf
doc.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);
// 打开pdf
doc.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);
// 打开pdf
doc.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);
// 打开pdf
doc.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);
}
}
///
/// 生成默认空白行
///
///
public static Paragraph GetBlankRow()
{
var blankRow = new Paragraph(" ", SetFontSizeColor());//设置字号大小和样式
blankRow.SetAlignment(Element.ALIGN_CENTER.ToString());
blankRow.SetLeading(10, 0);//行间距
return blankRow;
}
///
/// 合并两个表格
///
///
///
///
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
/// 合并多个表格
///
///
///
public static PdfPTable MergeMultTable(List 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>>(); }
///
/// 表格标题
///
public string TableTile { get; set; } = string.Empty;
public int Count { get; set; } = 12;
public bool HasLine { get; set; } = false;
public List>> 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();
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();
//构造第一个表格
PdfTableHelper.Table1.TableTile = Util.FindKey("BaseInformation");
PdfTableHelper.Table1.Rows = new List>>()
{
new KeyValuePair>("111",new List(){111}),
new KeyValuePair>("222",new List(){ 222 })
};
//构造第二个表格
PdfTableHelper.Table2.TableTile = Util.FindKey("ProgramParameters");
PdfTableHelper.Table2.Rows = new List>>();
PdfTableHelper.Table2.Rows.Add(new KeyValuePair>("333"), new List() { "333" }));
model = new PdfModels()
{
TableTile = xxx
};
model.Rows.Add(new KeyValuePair>("444"),
new List() { "1", "2", "3", "4", "5", "6" }));
foreach (var Temp in TempList)
{
model.Rows.Add(new KeyValuePair>(Temp.Hole, new List()
{
Temp.111,
Temp.222,
Temp.333,
Temp.444,
Temp.555,
Temp.666
}));
}
PdfTableHelper.TileTables.Add(model);
PdfTableHelper.WritePdf(FileName);
}