位置: 文档库 > C#(.NET) > 一个C#通过iTextSharp封装的PDF文件操作类代码

一个C#通过iTextSharp封装的PDF文件操作类代码

黄龙在天 上传于 2023-11-19 06:47

标题:一个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生成和编辑需求。

《一个C#通过iTextSharp封装的PDF文件操作类代码.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档