C#使用iTextSharp封装PDF操作类实现动态生成与排版

键盘旁的猫
键盘旁的猫
发布时间:2026-10-14| 5人浏览过
原创

本文介绍如何通过C#和iTextSharp库封装一个实用的PDF操作类,解决动态生成PDF时的繁琐配置问题。该类统一处理页面大小、中文字体、段落排版样式、图片缩放及超链接插入,提供简洁的接口供开发者快速集成。

为什么需要封装PDF操作类

iTextSharp是C#生态中生成PDF的强大工具,但原生API涉及大量的对象初始化、参数传递和流管理。例如,设置中文字体需要明确指定路径、编码方式及嵌入策略;调整段落属性需分别处理对齐、前后间距等。对于频繁需要生成报告或打印页面的应用,直接调用底层API会导致代码冗余且难以维护。

通过封装,可以将通用的PDF构建逻辑沉淀为单一组件。开发者只需关注业务数据,而无需关心底层的文档模型构建细节。本案例提供的PDFOperation类覆盖了从文档初始化到内容写入的完整生命周期。

环境准备与引用

在使用该代码前,请确保项目中已引用iTextSharp库。若使用的是较新版本,请注意命名空间可能变为和(旧版)或(新版)。以下示例基于经典的iTextSharp 5.x版本结构。

  1. 安装依赖:通过NuGet包管理器搜索并安装 iTextSharp。
  2. 字体资源:生成包含中文内容的PDF必须加载支持CJK字符的字库文件。Windows系统通常位于C:\Windows\Fonts\SIMHEI.TTF(黑体),Linux服务器需上传对应字体文件。

第1步:初始化文档与页面设置

目的:建立PDF基础结构,确定纸张大小和页边距。

PDFOperation提供了多个构造函数以适配不同需求:

  • 默认构造:创建A4纸张大小的文档,使用默认边距。
  • 自定义页面大小:传入如"A4"或"A8"字符串指定纸张类型。
  • 自定义边距:同时指定左、右、上、下四个方向的边距(单位通常为点,pt)。
// 简单模式:A4纸,默认边距
var pdf = new PDFOperation();

// 高级模式:A4纸,左右边距36pt,上下边距72pt
var pdf = new PDFOperation("A4", 36f, 36f, 72f, 72f);

第2步:配置中文字体与样式

目的:确保生成的PDF能正确显示中文及其他非ASCII字符,避免乱码。

由于PDF标准字体不支持中文,必须加载本地TTF文件。类中SetBaseFont方法固定使用IDENTITY_H编码和不嵌入策略(NOT_EMBEDDED),适合大多数屏幕阅读场景。若需离线分发且确保字体一致性,可调整嵌入策略。

pdf.SetBaseFont(@"C:\Windows\Fonts\SIMHEI.TTF");
// 设置当前段落使用的字号,如12号字
pdf.SetFont(12f);

第3步:打开文档并写入内容

目的:将内存中的文档对象输出到文件流,并添加文本段落。

操作顺序如下:

  1. Open:接收Stream对象(如FileStream),内部调用PdfWriter.GetInstance绑定输出流,并触发document.Open()开始写入。
  2. AddParagraph:添加单行或多行文本。基础方法仅指定内容与字号;进阶方法支持精细排版控制,包括:
    - Alignment:0左对齐,1居中,2右对齐。
    - SpacingAfter/Before:段后/段前间距。
    - MultipliedLeading:行间距倍数。
  3. Close:结束文档写入,释放资源。
// 1. 打开文档
string path = "test.pdf";
using (FileStream fs = new FileStream(path, FileMode.Create))
{
    pdf.Open(fs);
    
    // 2. 添加带排版的标题
    // 参数:内容, 字号, 对齐(1居中), 段后空行, 段前空行, 行距倍数
    pdf.AddParagraph("测试文档(生成时间:" + DateTime.Now + ")", 15, 1, 20, 0, 0);
    
    // 3. 添加普通正文
    pdf.AddParagraph("这是正文内容...", 12);
    
    // 4. 关闭并保存
    pdf.Close();
}

第4步:插入图片与超链接

目的:增强文档的可视化效果和功能交互性。

图片处理:AddImage方法自动处理图片缩放逻辑。若指定宽度且大于页面可用宽度,类会自动按比例压缩以适应页面;否则保持原尺寸。对齐方式同样支持左中右。

超链接:提供两种链接形式:
- AddAnchorReference:外部URL链接,点击跳转至网页。
- AddAnchorName:内部书签锚点,用于文档内跳转导航。

核心代码实现

以下是封装好的PDFOperation类完整实现,可直接复制到项目中使用。类内部通过私有字段缓存字体和页面矩形,减少重复计算。

using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace DotNet.Utilities
{
  public class PDFOperation
  {
    #region 构造函数
    public PDFOperation()
    {
      rect = PageSize.A4;
      document = new Document(rect);
    }

    public PDFOperation(string type)
    {
      SetPageSize(type);
      document = new Document(rect);
    }

    public PDFOperation(string type, float marginLeft, float marginRight, float marginTop, float marginBottom)
    {
      SetPageSize(type);
      document = new Document(rect, marginLeft, marginRight, marginTop, marginBottom);
    }
    #endregion

    #region 私有字段
    private Font font;
    private Rectangle rect;
    private Document document;
    private BaseFont basefont;
    #endregion

    #region 字体设置
    public void SetBaseFont(string path)
    {
      // IDENTITY_H 支持中文,NOT_EMBEDDED 减小文件体积
      basefont = BaseFont.CreateFont(path, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    }

    public void SetFont(float size)
    {
      font = new Font(basefont, size);
    }
    #endregion

    #region 页面设置
    public void SetPageSize(string type)
    {
      switch (type.Trim())
      {
        case "A4":
          rect = PageSize.A4;
          break;
        case "A8":
          rect = PageSize.A8;
          break;
        default:
          rect = PageSize.A4; // 默认回退
          break;
      }
    }
    #endregion

    #region 文档生命周期
    public void GetInstance(Stream os)
    {
      PdfWriter.GetInstance(document, os);
    }

    public void Open(Stream os)
    {
      GetInstance(os);
      document.Open();
    }

    public void Close()
    {
      document.Close();
    }
    #endregion

    #region 内容添加
    public void AddParagraph(string content, float fontsize)
    {
      SetFont(fontsize);
      Paragraph pra = new Paragraph(content, font);
      document.Add(pra);
    }

    /// <summary>
    /// 高级段落添加:支持对齐、间距、行距控制
    /// Alignment: 0=Left, 1=Center, 2=Right
    /// </summary>
    public void AddParagraph(string content, float fontsize, int Alignment, float SpacingAfter, float SpacingBefore, float MultipliedLeading)
    {
      SetFont(fontsize);
      Paragraph pra = new Paragraph(content, font);
      pra.Alignment = Alignment;
      if (SpacingAfter != 0) pra.SpacingAfter = SpacingAfter;
      if (SpacingBefore != 0) pra.SpacingBefore = SpacingBefore;
      if (MultipliedLeading != 0) pra.MultipliedLeading = MultipliedLeading;
      document.Add(pra);
    }

    public void AddImage(string path, int Alignment, float newWidth, float newHeight)
    {
      Image img = Image.GetInstance(path);
      img.Alignment = Alignment;
      if (newWidth != 0)
      {
        img.ScaleAbsolute(newWidth, newHeight);
      }
      else
      {
        // 若未指定宽高,但宽度超出页面,则自动缩放适应
        if (img.Width > PageSize.A4.Width)
        {
          img.ScaleAbsolute(rect.Width, img.Width * img.Height / rect.Height);
        }
      }
      document.Add(img);
    }

    public void AddAnchorReference(string Content, float FontSize, string Reference)
    {
      SetFont(FontSize);
      Anchor auc = new Anchor(Content, font);
      auc.Reference = Reference;
      document.Add(auc);
    }

    public void AddAnchorName(string Content, float FontSize, string Name)
    {
      SetFont(FontSize);
      Anchor auc = new Anchor(Content, font);
      auc.Name = Name;
      document.Add(auc);
    }
    #endregion
  }
}

注意事项与最佳实践

  • 资源释放:Document和Stream都实现了IDisposable接口。在实际使用中,建议将文件流包裹在using语句中,或在最后显式调用Close(),以防止文件占用或内存泄漏。
  • 字体兼容性:如果生成的PDF需要在不同操作系统上查看,最好将字体文件打包在项目资源中,运行时动态解压到临时目录再读取,避免依赖特定服务器的字体路径。
  • 复杂排版:此类适用于线性文本流为主的文档。如需表格、分栏或复杂布局,建议结合iTextSharp的Table或Chunk机制进一步扩展,或在封装类中添加相关便捷方法。

以上就是C#使用iTextSharp封装PDF操作类的详细内容,更多关于C# PDF编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。