C#生成PDF格式的合同文件

news/2024/10/17 12:25:14/

最近接手了一个项目,其中有个功能是生成PDF格式的合同文件。为此,现将代码分享出来!

效果图如下:

在这里插入图片描述

一、准备工作

首先C#代码操作pdf文件,需要引用一个pdf官方提供的两个dll,去网上下载,并将其添加引用到项目即可。
官方下载地址

PDF相关动态库
提取码:0jue
在这里插入图片描述

在代码中引用

using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;

二、创建PDF文件

private static void Main() {// 创建PDF文件FileStream pdfFs = new FileStream("C:\\MyText.pdf", FileMode.Create);//C:\\MyText.pdf为保存路径// 获取实例Document doc = new Document();PdfWriter.GetInstance(doc, pdfFs);// 打开pdfdoc.Open();iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance("C:\\logo.jpg");//C:\\logo.jpg为logo路径image.ScaleAbsolute(50, 50);image.SetAbsolutePosition(50, PageSize.A4.Height-50);doc.Add(image);Font font = SetFontSizeColor(20, BaseColor.BLACK);Paragraph tit = new Paragraph("深圳市双睿鑫科技有限公司", font);tit.Alignment = 1;//居中doc.Add(tit);// 合并多个表格List<PdfPTable> allTable = new List<PdfPTable>();allTable.Add(SetTitlePDf());PdfPTable table = MergeMult(allTable);doc.Add(table);//添加表格font = SetFontSizeColor(14, BaseColor.BLACK);tit = new Paragraph("订单详情", font);tit.IndentationLeft = 20;//左边距doc.Add(tit);// 合并多个表格allTable = new List<PdfPTable>();allTable.Add(SetMessPDF());table = MergeMultTable(allTable);doc.Add(table);// 添加表格font = SetFontSizeColor(14, BaseColor.BLACK);tit = new Paragraph("费用明细", font);tit.IndentationLeft = 20;//左边距doc.Add(tit);// 合并多个表格allTable = new List<PdfPTable>();allTable.Add(SetInfoPDF());table = MergeMultTable(allTable);doc.Add(table);//添加表格font = SetFontSizeColor(14, BaseColor.BLACK);tit = new Paragraph("合同条款", font);tit.IndentationLeft = 20;//左边距doc.Add(tit);List<string> str = new List<string>();str.Add("第一条合同条款。");str.Add("第二条合同条款。");str.Add("第三条合同条款。");str.Add("第四条合同条款。");str.Add("第五条合同条款。");str.Add("第六条合同条款。");str.Add("第七条合同条款。");str.Add("第八条合同条款。");str.Add("第九条合同条款。");str.Add("第十条合同条款。");doc = contract(str, doc);//合并多个表格allTable = new List<PdfPTable>();allTable.Add(SetBottomPDf());table = MergeMultTable(allTable);doc.Add(table);//添加表格image = iTextSharp.text.Image.GetInstance("C://contract.jpg");//C:\\contract.jpg为合同章路径image.ScaleAbsolute(150, 150);image.SetAbsolutePosition(PageSize.A4.Width-300, 10);doc.Add(image);//关闭doc.Close();pdfFs.Close();
}

三、写入内容

/// <summary>
/// 合同条款
/// </summary>
/// <param name="contractList">合同条款</param>
/// <param name="doc">pdf内容</param>
/// <returns></returns>
private static Document contract(List<string> contractList, Document doc)
{Font font;Paragraph tit;for (int i = 0; i < contractList.Count; i++){font = SetFont(10, BaseColor.BLACK);tit = new Paragraph((i + 1) + "、" + contractList[i], font);tit.IndentationLeft = 20;//左边距tit.IndentationRight = 20;//右边距tit.FirstLineIndent = 20;doc.Add(tit);}return doc;
}
/// <summary>
/// 创建一行N列
/// </summary>
/// <param name="columnNameList">列的元素</param>
/// <param name="fontSize">字号大小</param>
/// <returns></returns>
private static PdfPTable CreateOneRow(List<string> columnNameList, int fontSize)
{// 定义表格对象,参数是该表格的列数PdfPTable table = new PdfPTable(columnNameList.Count);// 实现自动换页table.SplitLate = false;table.SplitRows = true;// 获取字号Font font = SetFontSizeColor(fontSize, BaseColor.BLACK);// 定义单元格对象PdfPCell cell;int rowCount = columnNameList.Count;for (int i = 0; i < rowCount; i++){if (columnNameList[i] != null){cell = new PdfPCell(new Phrase(columnNameList[i], font));   // 将内容绑定到单元格中cell.PaddingTop = 20;cell.PaddingBottom = 30;cell.HorizontalAlignment = 1;   // 居中cell.DisableBorderSide(15);table.AddCell(cell);}}return table;
}
/// <summary>
/// 创建一行N列
/// </summary>
/// <param name="columnNameList">列的元素</param>
/// <param name="fontSize">字号大小</param>
/// <returns></returns>
private static PdfPTable CreateBottomRow(List<string> columnNameList, int fontSize)
{// 定义表格对象,参数是该表格的列数PdfPTable table = new PdfPTable(columnNameList.Count);// 实现自动换页table.SplitLate = false;table.SplitRows = true;// 获取字号Font font = SetFontSizeColor(fontSize, BaseColor.BLACK);// 定义单元格对象PdfPCell cell;int rowCount = columnNameList.Count;for (int i = 0; i < rowCount; i++){if (columnNameList[i] != null){cell = new PdfPCell(new Phrase(columnNameList[i], font));   // 将内容绑定到单元格中cell.HorizontalAlignment = PdfPCell.ALIGN_RIGHT;   // 右对齐cell.DisableBorderSide(15);table.AddCell(cell);}}return table;
}
/// <summary>
/// 创建一行N列表格
/// </summary>
/// <param name="columnNameList">列的元素</param>
/// <param name="fontSize">字号大小</param>
/// <returns></returns>
private static PdfPTable CreateOneRowTable(List<string> columnNameList, int fontSize)
{// 定义表格对象,参数是该表格的列数PdfPTable table = new PdfPTable(columnNameList.Count);// 实现自动换页table.SplitLate = false;table.SplitRows = true;// 获取字号Font font = SetFontSizeColor(fontSize, BaseColor.BLACK);// 定义单元格对象PdfPCell cell;int rowCount = columnNameList.Count;for (int i = 0; i < rowCount; i++){if (columnNameList[i] != null){cell = new PdfPCell(new Phrase(columnNameList[i], font));   // 将内容绑定到单元格中cell.HorizontalAlignment = 1;   // 居中table.AddCell(cell);}}return table;
}
/// <summary>
/// 设置字号与字体颜色
/// </summary>
/// <returns></returns>
private static Font SetFontSizeColor(int size, BaseColor color)
{BaseFont bfchinese = BaseFont.CreateFont(_WebConfig.GetAppSettingsString("ttf_url"), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//simkai.ttfFont ChFont = new iTextSharp.text.Font(bfchinese, size, Font.NORMAL, color);//Font.BOLD:加粗return ChFont;
}/// <summary>
/// 设置字号与字体颜色
/// </summary>
/// <returns></returns>
private static Font SetFont(int size, BaseColor color)
{BaseFont bfchinese = BaseFont.CreateFont(_WebConfig.GetAppSettingsString("ttf_url"), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//simkai.ttfFont ChFont = new iTextSharp.text.Font(bfchinese, size, Font.NORMAL, color);return ChFont;
}// 标题部分表格
public static PdfPTable SetTitlePDf()
{// 定义一个字符串链表,用于存储填入表格中的数据List<string> text = new List<string>();text.Add("商品销售合同");PdfPTable tableMain = CreateOneRow(text, 14);  // 创建一张仅有一行一列的表格text = new List<string>();text.Add("需求方(甲方):");text.Add("供应商(乙方):深圳市双睿鑫科技有限公司");text.Add("联系人:");text.Add("客服人员:张先生");text.Add("收货地址:");text.Add("地址:广东省深圳市龙华区");PdfPTable tableMess = CreateMultRowMultColumn(2, text);    // 根据数据创建多行多列表格// 将两张表合并成一张表PdfPTable table = MergeTwo(tableMain, tableMess);return table;}
// 标题部分表格
public static PdfPTable SetBottomPDf()
{// 定义一个字符串链表,用于存储填入表格中的数据List<string> text = new List<string>();text.Add("合同生成日期:" + DateTime.Now.ToLongDateString().ToString());PdfPTable tableMain = CreateBottomRow(text, 10);  // 创建一张仅有一行一列的表格text = new List<string>();text.Add("甲方代表签字:");text.Add("乙方代表签字:张先生");text.Add("盖章:");text.Add("盖章:");PdfPTable tableMess = CreateMultRowMultColumn(2, text);    // 根据数据创建多行多列表格// 将两张表合并成一张表PdfPTable table = MergeTwo(tableMain, tableMess);return table;}
/// <summary>
/// 合并两个表格
/// </summary>
/// <param name="table1"></param>
/// <param name="table2"></param>
/// <returns></returns>
public static PdfPTable MergeTwoTable(PdfPTable table1, PdfPTable table2)
{// 定义表格对象,参数代表是该表格一共由多少列PdfPTable table = new PdfPTable(1);// 定义单元格对象PdfPCell cell;// 实现自动换页table.SplitLate = false;table.SplitRows = true;// 这个函数写死是合并两个单元格int rowCount = 2;for (int i = 0; i < rowCount; i++){switch (i){case 0:// 单元格中添加表格1cell = new PdfPCell(table1);// 居中cell.Padding = 0;cell.DisableBorderSide(15);// 将单元格添加到表格中table.AddCell(cell);break;case 1:cell = new PdfPCell(table2);cell.Padding = 0;cell.DisableBorderSide(15);table.AddCell(cell);break;default:break;}}// 最后将合并好的表格返回return table;
}/// <summary>
/// 合并两个表格
/// </summary>
/// <param name="table1"></param>
/// <param name="table2"></param>
/// <returns></returns>
public static PdfPTable MergeTwo(PdfPTable table1, PdfPTable table2)
{// 定义表格对象,参数代表是该表格一共由多少列PdfPTable table = new PdfPTable(1);// 定义单元格对象PdfPCell cell;// 实现自动换页table.SplitLate = false;table.SplitRows = true;// 这个函数写死是合并两个单元格int rowCount = 2;for (int i = 0; i < rowCount; i++){switch (i){case 0:// 单元格中添加表格1cell = new PdfPCell(table1);// 居中cell.Padding = 0;cell.DisableBorderSide(15);// 将单元格添加到表格中table.AddCell(cell);break;case 1:cell = new PdfPCell(table2);cell.Padding = 0;cell.DisableBorderSide(15);table.AddCell(cell);break;default:break;}}// 最后将合并好的表格返回return table;
}// 订单详情部分表格
public static PdfPTable SetMessPDF()
{List<string> checkNameList = new List<string>();checkNameList.Add("商品");checkNameList.Add("单价");checkNameList.Add("数量");checkNameList.Add("总价");checkNameList.Add("周期");checkNameList.Add("发票");PdfPTable tableTitle = CreateOneRowTable(checkNameList, 12);    // 生成一张表格checkNameList = new List<string>();checkNameList.Add("iPhone 13");checkNameList.Add("¥5399");checkNameList.Add("100部");checkNameList.Add("¥53990");checkNameList.Add("5天");checkNameList.Add("增值税发票");PdfPTable tableMess = CreateMultRowMultColumnTable(6, checkNameList);       // 创建多行多列表格PdfPTable tableOverall = MergeTwoTable(tableTitle, tableMess);  // 两张表格上下合并//PdfPTable table = CreateRowTitleRowDataTable("订单详情", tableOverall, 5);  // 合并左边带标题信息的表格return tableOverall;
}
/// <summary>
/// 创建带行标题和一组数据的表格
/// </summary>
/// <param name="columnTitleName">行标题</param>
/// <param name="messPDFTable">数据表格</param>
/// <param name="columnCount">数据表的比例</param>
/// <returns></returns>
private static PdfPTable CreateRowTitleRowDataTable(string columnTitleName, PdfPTable messPDFTable, int columnCount)
{// 创建两列的表格PdfPTable table = new PdfPTable(2);// 设置列宽比例table.SetWidths(new int[] { 1, columnCount });  // 猜测:1比columnCount的比例// 设置自动换页table.SplitLate = false;table.SplitRows = true;// 设置字号字体颜色Font font = SetFontSizeColor(15, BaseColor.BLUE);PdfPCell cell;int rowCount = 2;for (int i = 0; i < rowCount; i++){switch (i){case 0:cell = new PdfPCell(new Phrase(columnTitleName, font));     // 新建一个单元格,数据作为参数cell.HorizontalAlignment = 1;table.AddCell(cell);        // 单元格添加到表格中break;case 1:cell = new PdfPCell(messPDFTable);  // 新建一个单元格,表格作为参数cell.Padding = 0;table.AddCell(cell);    // 单元格添加到表格中break;default:break;}}return table;
}
/// <summary>
/// 创建多行多列
/// </summary>
/// <param name="column">列数</param>
/// <param name="columnDataNameList">数据</param>
/// <returns></returns>
private static PdfPTable CreateMultRowMultColumn(int column, List<string> columnDataNameList)
{// 创建多列表格PdfPTable table = new PdfPTable(column);// 设置字号与字体颜色Font font = SetFontSizeColor(12, BaseColor.BLACK);// 设置自动换页table.SplitLate = false;table.SplitRows = true;// 定义单元格PdfPCell cell;// 这里的意思是:// 将链表中的数据一个一个的设置到单元格中,然后单元格添加到表格中// 这里需要注意,因为我们定义表格对象是设置了列数,所以设置单元格达到表的列数后,再次往表中添加单元格会自动换行添加!int rowColumn = columnDataNameList.Count;for (int i = 0; i < rowColumn; i++){// 实例化单元格对象,数据与字体设置到单元格中cell = new PdfPCell(new Phrase(columnDataNameList[i], font));cell.PaddingTop = 5;cell.PaddingBottom = 5;cell.DisableBorderSide(15);// 将单元格添加到表格中table.AddCell(cell);}return table;
}/// <summary>
/// 创建多行多列表格
/// </summary>
/// <param name="column">表格列数</param>
/// <param name="columnDataNameList">表格中的数据</param>
/// <returns></returns>
private static PdfPTable CreateMultRowMultColumnTable(int column, List<string> columnDataNameList)
{// 创建多列表格PdfPTable table = new PdfPTable(column);// 设置字号与字体颜色Font font = SetFontSizeColor(12, BaseColor.RED);// 设置自动换页table.SplitLate = false;table.SplitRows = true;// 定义单元格PdfPCell cell;// 这里的意思是:// 将链表中的数据一个一个的设置到单元格中,然后单元格添加到表格中// 这里需要注意,因为我们定义表格对象是设置了列数,所以设置单元格达到表的列数后,再次往表中添加单元格会自动换行添加!int rowColumn = columnDataNameList.Count;for (int i = 0; i < rowColumn; i++){// 实例化单元格对象,数据与字体设置到单元格中cell = new PdfPCell(new Phrase(columnDataNameList[i], font));cell.HorizontalAlignment = 1;// 将单元格添加到表格中table.AddCell(cell);}return table;
}// 费用明细部分表格
public static PdfPTable SetInfoPDF()
{List<string> checkNameList = new List<string>();checkNameList.Add("订单编号");checkNameList.Add("商品金额");checkNameList.Add("税费");checkNameList.Add("总金额");PdfPTable tableTitle = CreateOneRowTable(checkNameList, 12);    // 生成一张标题表格checkNameList = new List<string>();checkNameList.Add("20220512001");checkNameList.Add("¥53990");checkNameList.Add("¥7018.7");checkNameList.Add("¥61008.7");PdfPTable tableMess = CreateMultRowMultColumnTable(4, checkNameList);    // 根据数据创建多行多列表格PdfPTable tableOverall = MergeTwoTable(tableTitle, tableMess);              // 将两张表合并成一张表// 新建一个表格,一行两列,第一列写入参数一数据,第二列放入参数二表格//PdfPTable table = CreateRowTitleRowDataTable("费用明细", tableOverall, 5);return tableOverall;
}
/// <summary>
/// 合并多个表格
/// </summary>
/// <param name="pdfList"></param>
/// <returns></returns>
public static PdfPTable MergeMultTable(List<PdfPTable> pdfList)
{PdfPTable table = new PdfPTable(1);PdfPCell cell;table.SplitLate = false;table.SplitRows = true;// 将表格绑定到单元格中,然后将单元格插入汇总表格foreach (PdfPTable pdf in pdfList){cell = new PdfPCell(pdf);cell.Padding = 0;cell.PaddingTop = 10;cell.DisableBorderSide(15);//隐藏Table边框table.AddCell(cell);}return table;
}
/// <summary>
/// 合并多行
/// </summary>
/// <param name="pdfList"></param>
/// <returns></returns>
public static PdfPTable MergeMult(List<PdfPTable> pdfList)
{PdfPTable table = new PdfPTable(1);PdfPCell cell;table.SplitLate = false;table.SplitRows = true;// 将表格绑定到单元格中,然后将单元格插入汇总表格foreach (PdfPTable pdf in pdfList){cell = new PdfPCell(pdf);cell.PaddingLeft = -30;cell.PaddingRight = -30;cell.DisableBorderSide(15);//隐藏Table边框table.AddCell(cell);}return table;
}

四、总结

C#生成PDF文件无非就是表格类PdfPTable与单元格类PdfPCell互相配合使用而已!根据自己的需求封装函数创建表格返回就行。


http://www.ppmy.cn/news/755131.html

相关文章

PDF文件不能编辑怎么办?

PDF文件不能编辑有很多原因&#xff0c;有可能是PDF文件不是文字内容而是图片内容&#xff0c;这种情况很有可能是扫描PDF文件&#xff0c;还有一种可能就是PDF文件设置了限制编辑。两种情况&#xff0c;解决问题的方法也是不一样的。 如果PDF文件是扫描文件&#xff0c;我们就…

前端vue入门(纯代码)22_四个map

女为悦己者容&#xff0c;男为悦己者穷。&#xff01;&#xff01;&#xff01; 【23.Vuex中的四个map方法】 [可以去官网看看Vuex3文档](Vuex 是什么&#xff1f; | Vuex (vuejs.org)) 1.vuex求和案例—getters版 getters概念&#xff1a;当state中的数据需要经过加工后再…

18-Linux 常用命令

目录 1.ls PS&#xff1a;FinalShell设置背景和字体 2.pwd 3.cd PS&#xff1a;认识 Linux 目录结构——Linux 是一个树形目录结构 PS&#xff1a;绝对路径 vs 相对路径 PS&#xff1a;使用 tab 键补全 PS&#xff1a;使用 ctrl c 重新输入 4.touch PS&#xff1a;L…

n位吸血鬼数字的算法

吸血鬼数字是指位数为偶数的数字&#xff0c;可以由一对数字相乘而得到&#xff0c;而这对数字各包含乘积的一半位数的数字&#xff0c;其中从最初的数字中选取的数字可以任意排序。在java编程思想发现了一道吸血鬼数字算法的题目&#xff0c;自己分别写出了4位和6位的算法&…

吸血鬼数字(多种解法)

最近在读《Thinking in JAVA》,在里面发现一个很有意思的题&#xff0c;该题在75页&#xff0c;第四章第十题 原题&#xff1a; 吸血鬼数字是指位数为偶数的数字&#xff0c;可以由一堆数字想乘而得到。而这对数字各包含乘积的一半位数的数字&#xff0c;其中从最初的数字中选…

中华吸血鬼病毒专杀

此病毒最明显的特征是压缩文件里加入绿化.bat,诱使用户点击。 病毒特征&#xff1a; 在关闭杀软之后弹出窗口&#xff0c;容易给不知情者以迷惑&#xff1b; 病毒释放的wsock32.dll会使得任意该目录下的exe文件成为下载病毒文件的傀儡&#xff1b; 再次由于windows的某些保护…

神话与历史中的吸血鬼

神话与历史中的吸血鬼 “每当鲜血缓缓流进我的喉咙&#xff0c;我知道我是被诅咒了。所以我微笑着&#xff0c;享受这痛苦生活所带来的仅有快乐。”——“堕落天使”SombreNuit在这个鬼魅和怪兽大行其道的阴暗世界&#xff0c;没有一种生物能如此深深地把恐惧的种子植进你的心…

吸血鬼的故事

关于吸血鬼&#xff0c;最初的概念是小时候爱看的法国动画片《怪鸭历险记》也就是Decula的动画版&#xff0c;那时对吸血鬼还没有很清晰的认识&#xff0c;只是觉得这只鸭子很特别&#xff0c;居然睡在棺材里&#xff0c;这个动画片的风格也不同与其他动画片。后来看了《吸血惊…