本文共 8707 字,大约阅读时间需要 29 分钟。
最近在公司接手了一个检测软件的项目,其中里面就包含了一个模块是需要将检测出来的数据写入pdf文件中保存!
为此,参考了公司前辈的一些代码,自己在项目中写了一边,懂得了一些心得,现将代码过程记录下来,分享!首先C#代码操作pdf文件,需要引用一个pdf官方提供的两个dll,去网上下载,并将其添加引用到项目即可!
如下: 可以在官网下载:或者點擊下面百度網盤鏈接進行下載:
链接: 提取码:cppp如下面将其添加引用到自己的项目中去即可,
然后在代码中添加:
using iTextSharp.text;using iTextSharp.text.pdf;using System.IO;
到此,准备工作已经做完!
接下来看看本次博客将带领大家要实现的效果:
就这么简单的一个表格这里要跟大家讲明白一个概念,写入的表格并不是一次性创建的,而是先创建一部分小的表格,然后拼接成大表格的。如上图表格,就是通过八个小表格拼接而来的。这八个小表格分别是:
上图中,又可以总结分成三张表格进行拼接,如下三张:
所以呢,我是定义三个函数分别创建每一张表,然后再main函数中将他们拼接的。注意,下面的操作基本上都是创建一个单元格PdfPCell,然后将数据写入单元格中,或者将表格设置到单元格中;最后才将创建一个最终PdfPTable表格,将单元格添加到表格中。
// 创建PDF文件FileStream pdfFs = new FileStream("MyText.pdf", FileMode.Create);// 获取实例Document doc = new Document();PdfWriter.GetInstance(doc, pdfFs);// 打开pdfdoc.Open();// 关闭doc.Close();pdfFs.Close();
通过上面代码可以创建一个空白的pdf文件!
不用理解其含义是什么,只需知道他有什么作用就行,怎么使用就行。
最终函数返回的是Font对象////// 设置字号与字体颜色/// ///private static Font SetFontSizeColor(int size, Color color) { BaseFont bfchinese = BaseFont.CreateFont(@"c:\windows\fonts\simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//simkai.ttf Font ChFont = new iTextSharp.text.Font(bfchinese, size, Font.BOLD, color); return ChFont;}
////// 创建一行N列表格/// /// 列的元素/// 字号大小///private static PdfPTable CreateOneRowTable(List columnNameList, int fontSize) { // 定义表格对象,参数是该表格的列数 PdfPTable table = new PdfPTable(columnNameList.Count); // 实现自动换页 table.SplitLate = false; table.SplitRows = true; // 获取字号 Font font = SetFontSizeColor(fontSize, Color.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;}
创建的表格效果如下:
将两张表上下合并
////// 合并两个表格/// /// /// ///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: // 单元格中添加表格1 cell = new PdfPCell(table1); // 居中 cell.Padding = 0; // 将单元格添加到表格中 table.AddCell(cell); break; case 1: cell = new PdfPCell(table2); cell.Padding = 0; table.AddCell(cell); break; default: break; } } // 最后将合并好的表格返回 return table;}
创建的表格效果如下:
就是将多个表格进行上下合并(“合并两个表格”的升级版)
////// 合并多个表格/// /// ///public static PdfPTable MergeMultTable(List 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; table.AddCell(cell); } return table;}
创建的表格效果如下:
就是创建一个表格有很多列和很多行单元格。
这里需要注意,他实现多行多列创建表格的方式是:
多列实现方式:定义表格对象时就指定了列数,这就是多列的实现方式; 多行实现方式:循环定义多个单元格,然后将单元格添加到表格中,当添加单元格的数量大于列数时,下一次添加单元格就会自动换行进行添加,以此方式达到多行效果!////// 创建多行多列表格/// /// 表格列数/// 表格中的数据///private static PdfPTable CreateMultRowMultColumnTable(int column, List columnDataNameList) { // 创建多列表格 PdfPTable table = new PdfPTable(column); // 设置字号与字体颜色 Font font = SetFontSizeColor(12, Color.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;}
创建的表格效果如下:
注意:列数一定要满,就是你定义表格是3列的,那么就一定要定义三个单元格添加到表格中(或者六个、九个等),否则pdf文件会出问题!也就是左边是一个标题,右边是内容的表格,看下面图片就知道啦!
////// 创建带行标题和一组数据的表格/// /// 行标题/// 数据表格/// 数据表的比例///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(18, Color.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;}
创建的表格效果如下:
这种类型的表格很常见吧! 好了,到了这里,辅助函数就已经写完,开始创建表格,并写入pdf文件中吧!// 标题部分表格public static PdfPTable SetTitlePDf() { // 定义一个字符串链表,用于存储填入表格中的数据 Listtext = new List (); text.Add("C#往PDF格式写入表格教程"); PdfPTable tableMain = CreateOneRowTable(text, 20); // 创建一张仅有一行一列的表格 text = new List (); text.Add("语文"); text.Add("数学"); text.Add("英语"); text.Add("历史"); text.Add("政治"); text.Add("地理"); text.Add("音乐"); text.Add("体育"); PdfPTable tableMain2 = CreateOneRowTable(text, 12); // 创建张仅有一行多列的表格 // 将两张表合并成一张表 PdfPTable table = MergeTwoTable(tableMain, tableMain2); return table;}
也就是这样的:
// 个人信息部分表格public static PdfPTable SetMessPDF() { ListcheckNameList = new List (); checkNameList.Add("姓名"); checkNameList.Add("性别"); checkNameList.Add("年龄"); PdfPTable tableTitle = CreateOneRowTable(checkNameList, 15); // 生成一张表格 checkNameList = new List (); checkNameList.Add("小明"); checkNameList.Add("男"); checkNameList.Add("20"); checkNameList.Add("小红"); checkNameList.Add("女"); checkNameList.Add("22"); checkNameList.Add("小黄"); checkNameList.Add("男"); checkNameList.Add("26"); PdfPTable tableMess = CreateMultRowMultColumnTable(3, checkNameList); // 创建多行多列表格 PdfPTable tableOverall = MergeTwoTable(tableTitle, tableMess); // 两张表格上下合并 PdfPTable table = CreateRowTitleRowDataTable("个人信息", tableOverall, 3); // 合并左边带标题信息的表格 return table;}
也就是这样的:
// 详细信息部分表格public static PdfPTable SetInfoPDF() { ListcheckNameList = new List (); checkNameList.Add("姓名"); checkNameList.Add("爱好"); checkNameList.Add("特点"); checkNameList.Add("身高"); PdfPTable tableTitle = CreateOneRowTable(checkNameList, 15); // 生成一张标题表格 checkNameList = new List (); checkNameList.Add("小明"); checkNameList.Add("游泳"); checkNameList.Add("擅长蛙泳"); checkNameList.Add("170cm"); checkNameList.Add("小红"); checkNameList.Add("跳舞"); checkNameList.Add("街舞鼻祖"); checkNameList.Add("165cm"); checkNameList.Add("小黄"); checkNameList.Add("跑步"); checkNameList.Add("短跑小王子"); checkNameList.Add("172cm"); PdfPTable tableMess = CreateMultRowMultColumnTable(4, checkNameList); // 根据数据创建多行多列表格 PdfPTable tableOverall = MergeTwoTable(tableTitle, tableMess); // 将两张表合并成一张表 // 新建一个表格,一行两列,第一列写入参数一数据,第二列放入参数二表格 PdfPTable table = CreateRowTitleRowDataTable("详细信息", tableOverall, 3); return table;}
也就是这样的:
private static void Main() { // 创建PDF文件 FileStream pdfFs = new FileStream("MyText.pdf", FileMode.Create); // 获取实例 Document doc = new Document(); PdfWriter.GetInstance(doc, pdfFs); // 打开pdf doc.Open(); // 合并多个表格 ListallTable = new List (); allTable.Add(SetTitlePDf()); allTable.Add(SetMessPDF()); allTable.Add(SetInfoPDF()); PdfPTable table = MergeMultTable(allTable); doc.Add(table); // 添加表格 // 关闭 doc.Close(); pdfFs.Close();}
运行结果就是最终效果了:
C#操作pdf文件就是如此,其实貌似不是很难。无非就是表格类PdfPTable与单元格类PdfPCell互相配合使用而已!
而且,根据自己的需求封装函数创建表格返回就行。然后在进行调用进行。转载地址:http://zmjzb.baihongyu.com/