最近在公司接手了一个检测软件的项目,其中里面就包含了一个模块是需要将检测出来的数据写入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.ttfFont 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:// 单元格中添加表格1cell = 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);// 打开pdfdoc.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文件(写入表格)相关推荐

  1. 零代码编程:用ChatGPT将PDF文件的表格批量转为Excel表格

    电脑中有几百个PDF文件,文件内容格式一致,每个PDF文件第一页是一个表格.想把这几百个PDF文件里面的表格都提取出来,转为excel表,该怎么办? 打开ChatGPT(一定要用GPT4,编程能力很强 ...

  2. Python办公自动化——提取pdf文件中表格并到Excel

    Python办公自动化--提取pdf文件中表格合并到Excel 需求描述 现有一 pdf 文件内容如下,文件中内容主要是表格形式的获奖名单,共158页.现要读取这些表格信息并保存到 excel 文件中 ...

  3. itext7 对pdf文件添加表格水印

    1.pom.xml中添加依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7 ...

  4. fpdf fpdi 操作pdf文件 写入中文汉字

      今天给公司做一个线上合同签约功能,用户签约后 生成pdf版的文件 .网上搜了搜大概都是用fpdf进行操作的  , 通过fpdi 可以进行读取pdf模板. 在通过继承fpdf 操作现有的pdf文档 ...

  5. itextpdf导出pdf流,写入表格 ,以及生成水印

    导出PDF流 设置响应参数HttpServletResponse response.setCharacterEncoding("utf-8");response.setConten ...

  6. python读取dat文件写入表格_Pandas:外部文件数据导入/ 读取 (如 :csv、txt、tsv、dat、excel文件)、文件存储(to_csv、to_excel)...

    一.文本文件读取 文本文件是一种由若干行字符构成的计算机文件,它是一种典型的顺序文件. csv是一种逗号分隔的文件格式,因为其分隔符不一定是逗号,又被称为字符分隔文件,文件以纯文本形式存储表格数据(数 ...

  7. python读取dat文件写入表格_在python中从.dat文件读取和执行计算

    我需要用python读取一个.dat文件,它总共有12列,数百万行.我需要把第2.3和4栏和第1栏分开计算.所以在加载.dat文件之前,是否需要删除所有其他不需要的列?如果没有,如何有选择地声明列并要 ...

  8. python读取pdf并写入excel_Python读取pdf表格写入excel代码方法

    本篇文章小编给大家分享一下Python读取pdf表格写入excel代码方法,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 避免CV大法 pdf 文件的 ...

  9. 8、【办公自动化】Python实现PDF文件的批量操作

    说明 平时工作中,经常会和 PDF 文件打交道,比如,合并.拆分.加解密.添加和去除水印.提取指定内容.转换成其他文件格式等操作.如果只是处理单个 PDF 文件的话,有些操作是比较简单的,而如果需要批 ...

最新文章

  1. MongoDB 基础教程CURD帮助类
  2. Python爬虫自学之第(⑤)篇——爬取某宝商品信息
  3. oracle类似sqlcmd工具,Oracle:是否有跟踪查询的工具,例如用于SQL Server的Profiler?...
  4. 【TensorFlow】TensorFlow从浅入深系列之十二 -- 教你深入理解卷积神经网络中的池化层
  5. heart ultrasound from american society of echocardiography
  6. mysql queries 很大,mysql优化通常使用的几种方法
  7. SpringBoot整合Selenium
  8. 如何把word默认新建文档的格式样式更改为常用的格式样式呢
  9. 愿你不会像我一样,活成狗一般的生活!
  10. Stimulsoft Reports报告工具,Stimulsoft创建和构建报告
  11. 阿里大数据平台MaxCompute初窥
  12. 加拿大综合类大学排名获关注,盘点高校对雅思要求
  13. 圈圈教你玩USB学习总结
  14. hostname命令的使用
  15. IT人员必须知道的14个学习网站
  16. 炫技:拼接列表、破碎二维数组——Python sum()函数隐藏技能花式玩法
  17. 承接外协电气自控工程
  18. YOLOV8-gradcam 热力图可视化 即插即用 不需要对源码做任何修改!
  19. 三相半波可控整流电路matlab仿真,三相桥式可控整流电路的MATLAB仿真
  20. FPGA/数字IC手撕代码8——秒表计数器

热门文章

  1. Bregman Divergence
  2. 自定义控件三部曲视图篇(四)——RecyclerView系列之一简单使用
  3. 计算机技术与维修结课论文,计算机维护技术结课论文.doc
  4. 7-10 排座位(并查集)
  5. Spine骨骼动画知识普及
  6. 如何降低直线导轨的摩擦系数?
  7. LeetCode 121 Best Time to Buy and Sell Stock(股票买入卖出的最佳时间)
  8. Gradle 构建速度优化
  9. 我爬了商圈百晓生花爷的星球,都是些什么样的大佬花友!
  10. 关于传统蒙古文系统的系列文章(二)