标题:一个C#通过iTextSharp封装的PDF文件操作类代码
### 引言
在.NET开发中,PDF文件的生成、编辑和操作是常见的业务需求。无论是生成报表、合同还是电子票据,PDF因其格式稳定、跨平台兼容性强,成为首选的文档格式。iTextSharp是一个开源的.NET库,提供了强大的PDF操作功能,包括创建、修改、合并、拆分等。本文将详细介绍如何封装一个基于iTextSharp的PDF操作类,涵盖核心功能如文本添加、表格生成、图片插入、水印设置等,并提供完整的代码实现。
### 一、iTextSharp简介
iTextSharp是iText库的.NET版本,支持PDF的创建和修改。其核心功能包括:
- 文本、图片、表格的添加
- 字体、颜色、样式的自定义
- 页眉、页脚、水印的设置
- PDF合并、拆分、加密
- 表单填充和签名
使用iTextSharp前,需通过NuGet安装包:
Install-Package iTextSharp
### 二、PDF操作类设计
封装PDF操作类的目标是简化重复代码,提供统一的接口。类设计应包含以下功能:
- 初始化PDF文档
- 添加文本、段落
- 插入表格
- 添加图片
- 设置水印
- 保存文档
### 三、完整代码实现
#### 1. 基础类结构
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
public class PdfGenerator
{
private Document _document;
private PdfWriter _writer;
private string _outputPath;
public PdfGenerator(string outputPath)
{
_outputPath = outputPath;
_document = new Document();
_writer = PdfWriter.GetInstance(_document, new FileStream(_outputPath, FileMode.Create));
_document.Open();
}
public void Dispose()
{
_document.Close();
_writer.Close();
}
}
#### 2. 添加文本和段落
public void AddText(string text, Font font = null)
{
if (font == null)
{
font = FontFactory.GetFont(FontFactory.HELVETICA, 12, BaseColor.BLACK);
}
Paragraph paragraph = new Paragraph(text, font);
_document.Add(paragraph);
}
public void AddParagraph(string text, Font font, float leading)
{
Paragraph paragraph = new Paragraph(text, font);
paragraph.Leading = leading;
_document.Add(paragraph);
}
#### 3. 插入表格
public void AddTable(int columns, List> data, Font headerFont, Font cellFont)
{
PdfPTable table = new PdfPTable(columns);
table.WidthPercentage = 100;
// 添加表头
foreach (var header in data[0])
{
table.AddCell(new PdfPCell(new Phrase(header, headerFont))
{
BackgroundColor = BaseColor.LIGHT_GRAY,
HorizontalAlignment = Element.ALIGN_CENTER
});
}
// 添加数据行
for (int i = 1; i
#### 4. 添加图片
public void AddImage(string imagePath, float width, float height, float x, float y)
{
Image image = Image.GetInstance(imagePath);
image.ScaleToFit(width, height);
image.SetAbsolutePosition(x, y);
_document.Add(image);
}
#### 5. 设置水印
public void AddWatermark(string text, Font font, float opacity)
{
PdfContentByte watermark = _writer.DirectContentUnder;
watermark.BeginText();
watermark.SetFontAndSize(font.BaseFont, font.Size);
watermark.SetRGBColorFill(200, 200, 200);
watermark.ShowTextAligned(Element.ALIGN_CENTER, text,
_document.PageSize.Width / 2, _document.PageSize.Height / 2, 45);
watermark.EndText();
}
#### 6. 完整示例
public class PdfGenerator : IDisposable
{
private Document _document;
private PdfWriter _writer;
private string _outputPath;
public PdfGenerator(string outputPath)
{
_outputPath = outputPath;
_document = new Document();
_writer = PdfWriter.GetInstance(_document, new FileStream(_outputPath, FileMode.Create));
_document.Open();
}
public void AddText(string text, Font font = null)
{
font ??= FontFactory.GetFont(FontFactory.HELVETICA, 12, BaseColor.BLACK);
_document.Add(new Paragraph(text, font));
}
public void AddTable(int columns, List> data, Font headerFont, Font cellFont)
{
PdfPTable table = new PdfPTable(columns) { WidthPercentage = 100 };
// 表头
foreach (var header in data[0])
{
table.AddCell(new PdfPCell(new Phrase(header, headerFont))
{
BackgroundColor = BaseColor.LIGHT_GRAY,
HorizontalAlignment = Element.ALIGN_CENTER
});
}
// 数据行
for (int i = 1; i
### 四、使用示例
class Program
{
static void Main()
{
string outputPath = "output.pdf";
using (var pdf = new PdfGenerator(outputPath))
{
// 添加标题
Font titleFont = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 18, BaseColor.BLUE);
pdf.AddText("PDF生成示例", titleFont);
// 添加表格
Font headerFont = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 12, BaseColor.WHITE);
Font cellFont = FontFactory.GetFont(FontFactory.HELVETICA, 10, BaseColor.BLACK);
var tableData = new List>
{
new List { "ID", "姓名", "年龄" },
new List { "1", "张三", "25" },
new List { "2", "李四", "30" }
};
pdf.AddTable(3, tableData, headerFont, cellFont);
// 添加图片
pdf.AddImage("logo.png", 100, 50);
// 添加水印
pdf.AddWatermark("机密");
}
Console.WriteLine($"PDF已生成至: {outputPath}");
}
}
### 五、高级功能扩展
#### 1. 页眉页脚
public class HeaderFooter : PdfPageEventHelper
{
public override void OnEndPage(PdfWriter writer, Document document)
{
PdfContentByte cb = writer.DirectContent;
cb.BeginText();
cb.SetFontAndSize(FontFactory.GetFont(FontFactory.HELVETICA, 8).BaseFont, 8);
cb.ShowTextAligned(Element.ALIGN_CENTER,
$"页码: {writer.PageNumber}",
document.PageSize.Width / 2, 20, 0);
cb.EndText();
}
}
// 使用方式
_writer.PageEvent = new HeaderFooter();
#### 2. PDF合并
public static void MergePdfs(List inputPaths, string outputPath)
{
Document document = new Document();
PdfCopy copy = new PdfCopy(document, new FileStream(outputPath, FileMode.Create));
document.Open();
foreach (var path in inputPaths)
{
PdfReader reader = new PdfReader(path);
for (int i = 1; i
### 六、常见问题解决
#### 1. 中文显示问题
iTextSharp默认不支持中文字体,需手动加载中文字体文件:
BaseFont bf = BaseFont.CreateFont("C:\\Windows\\Fonts\\simsun.ttc",
BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font chineseFont = new Font(bf, 12);
#### 2. 内存泄漏
确保在完成后调用`Dispose()`或`using`语句释放资源。
### 七、总结
本文封装了一个基于iTextSharp的PDF操作类,涵盖了文本、表格、图片、水印等核心功能,并提供了高级扩展如页眉页脚和PDF合并。通过封装,开发者可以更高效地处理PDF文件,减少重复代码。实际应用中,可根据需求进一步扩展功能,如支持HTML转PDF、表单填充等。
关键词:C#、iTextSharp、PDF操作类、文本添加、表格生成、图片插入、水印设置、PDF合并、.NET开发
简介:本文详细介绍了如何使用C#通过iTextSharp库封装一个PDF文件操作类,涵盖文本、表格、图片、水印等核心功能,并提供完整代码实现和高级扩展方法,适用于.NET开发中的PDF生成和编辑需求。