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;
}

创建的表格效果如下:

  1. 一行一列的表格
    在这里插入图片描述
  2. 一行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;
}

创建的表格效果如下:

  1. 上下合并
    在这里插入图片描述
  2. 上下合并
    在这里插入图片描述

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文件(写入表格)的主要内容,如果未能解决你的问题,请参考以下文章

从Node.js Stream写入多个文件

在java中将HTML表格写入PDF [重复]

在 C# 中在运行时创建 pdf 文件 [关闭]

在 C# 中在运行时创建 pdf 文件 [关闭]

C#写PDF文件类库PDF File Writer介绍

C#将文件转成16进制码流写入数据库存起来,访问的时候再还原成PDF文件。