C# 写pdf文件(写入表格)
Posted cpp_learner
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 写pdf文件(写入表格)相关的知识,希望对你有一定的参考价值。
最近在公司接手了一个检测软件的项目,其中里面就包含了一个模块是需要将检测出来的数据写入pdf文件中保存!
为此,参考了公司前辈的一些代码,自己在项目中写了一边,懂得了一些心得,现将代码过程记录下来,分享!
一、准备工作
首先C#代码操作pdf文件,需要引用一个pdf官方提供的两个dll,去网上下载,并将其添加引用到项目即可!
如下:
可以在官网下载:https://sourceforge.net/projects/itextsharp/
或者點擊下面百度網盤鏈接進行下載:
链接:https://pan.baidu.com/s/1l1bstHyCNL8fFt_FMWInDg
提取码:cppp
如下面将其添加引用到自己的项目中去即可,
然后在代码中添加:
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
到此,准备工作已经做完!
接下来看看本次博客将带领大家要实现的效果:
就这么简单的一个表格
这里要跟大家讲明白一个概念,写入的表格并不是一次性创建的,而是先创建一部分小的表格,然后拼接成大表格的。如上图表格,就是通过八个小表格拼接而来的。这八个小表格分别是:
上图中,又可以总结分成三张表格进行拼接,如下三张:
所以呢,我是定义三个函数分别创建每一张表,然后再main函数中将他们拼接的。
二、创建一个pdf文件
注意,下面的操作基本上都是创建一个单元格PdfPCell,然后将数据写入单元格中,或者将表格设置到单元格中;最后才将创建一个最终PdfPTable表格,将单元格添加到表格中。
1. 创建一个空白的pdf文件
// 创建PDF文件
FileStream pdfFs = new FileStream("MyText.pdf", FileMode.Create);
// 获取实例
Document doc = new Document();
PdfWriter.GetInstance(doc, pdfFs);
// 打开pdf
doc.Open();
// 关闭
doc.Close();
pdfFs.Close();
通过上面代码可以创建一个空白的pdf文件!
2. 一些辅助函数
a. 设置字号与字体颜色
不用理解其含义是什么,只需知道他有什么作用就行,怎么使用就行。
最终函数返回的是Font对象
/// <summary>
/// 设置字号与字体颜色
/// </summary>
/// <returns></returns>
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;
}
b. 创建一行N列表格
/// <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, 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;
}
创建的表格效果如下:
- 一行一列的表格
- 一行N列的表格
c. 合并两个表格
将两张表上下合并
/// <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:
// 单元格中添加表格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;
}
创建的表格效果如下:
- 上下合并
- 上下合并
d. 合并多个表格
就是将多个表格进行上下合并(“合并两个表格”的升级版)
/// <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;
table.AddCell(cell);
}
return table;
}
创建的表格效果如下:
e. 创建多行多列表格
就是创建一个表格有很多列和很多行单元格。
这里需要注意,他实现多行多列创建表格的方式是:
多列实现方式:定义表格对象时就指定了列数,这就是多列的实现方式;
多行实现方式:循环定义多个单元格,然后将单元格添加到表格中,当添加单元格的数量大于列数时,下一次添加单元格就会自动换行进行添加,以此方式达到多行效果!
/// <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, 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文件会出问题!
f. 创建带行标题和一组数据的表格
也就是左边是一个标题,右边是内容的表格,看下面图片就知道啦!
/// <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(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文件中吧!
3. 创建表格
A. 标题部分表格创建
// 标题部分表格
public static PdfPTable SetTitlePDf() {
// 定义一个字符串链表,用于存储填入表格中的数据
List<string> text = new List<string>();
text.Add("C#往PDF格式写入表格教程");
PdfPTable tableMain = CreateOneRowTable(text, 20); // 创建一张仅有一行一列的表格
text = new List<string>();
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;
}
也就是这样的:
B. 个人信息部分表格创建
// 个人信息部分表格
public static PdfPTable SetMessPDF() {
List<string> checkNameList = new List<string>();
checkNameList.Add("姓名");
checkNameList.Add("性别");
checkNameList.Add("年龄");
PdfPTable tableTitle = CreateOneRowTable(checkNameList, 15); // 生成一张表格
checkNameList = new List<string>();
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;
}
也就是这样的:
C. 详细信息部分表格创建
// 详细信息部分表格
public static PdfPTable SetInfoPDF() {
List<string> checkNameList = new List<string>();
checkNameList.Add("姓名");
checkNameList.Add("爱好");
checkNameList.Add("特点");
checkNameList.Add("身高");
PdfPTable tableTitle = CreateOneRowTable(checkNameList, 15); // 生成一张标题表格
checkNameList = new List<string>();
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;
}
也就是这样的:
D. Main函数中调用创建
private static void Main() {
// 创建PDF文件
FileStream pdfFs = new FileStream("MyText.pdf", FileMode.Create);
// 获取实例
Document doc = new Document();
PdfWriter.GetInstance(doc, pdfFs);
// 打开pdf
doc.Open();
// 合并多个表格
List<PdfPTable> allTable = new List<PdfPTable>();
allTable.Add(SetTitlePDf());
allTable.Add(SetMessPDF());
allTable.Add(SetInfoPDF());
PdfPTable table = MergeMultTable(allTable);
doc.Add(table); // 添加表格
// 关闭
doc.Close();
pdfFs.Close();
}
运行结果就是最终效果了:
四、总结
C#操作pdf文件就是如此,其实貌似不是很难。无非就是表格类PdfPTable与单元格类PdfPCell互相配合使用而已!
而且,根据自己的需求封装函数创建表格返回就行。然后在进行调用进行。
以上是关于C# 写pdf文件(写入表格)的主要内容,如果未能解决你的问题,请参考以下文章