C# iTextSharp PDF操作类封装与使用指南

沈亦白
沈亦白
发布时间:2026-10-13| 4人浏览过
原创

在C#开发中,生成或修改PDF文件常依赖第三方库。本文展示了一个基于iTextSharp的通用PDF操作类PDFOperation,涵盖页面设置、中文渲染、内容写入及资源管理,帮助开发者快速集成PDF生成功能。

iTextSharp环境准备

iTextSharp是Java版iText的.NET移植版本,广泛用于C#应用程序中的PDF处理。在使用提供的代码前,必须完成以下准备工作:

  • 获取库文件:下载 iTextSharp.dll 并将其添加到项目的引用中。
    注意:由于版本差异,建议使用稳定版DLL(如5.x系列),并在命名空间中使用 iTextSharp.text.pdf 和 iTextSharp.text。
  • 字体依赖:PDF标准默认不包含中文字体。若需输出中文,需加载外部字体文件(如SimHei.ttf)并指定Unicode编码映射(Identity-H)。

核心功能实现

PDFOperation类对iTextSharp的Document、PdfWriter、BaseFont等核心对象进行了封装,主要包含以下几个关键模块:

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

目的:确定PDF页面的物理规格和边距。

构造函数重载支持不同参数:

  • 默认无参构造使用标准 A4 纸张大小。
  • 可通过字符串参数(如"A4")指定页型。
  • 可精确设置左、右、上、下四边距(浮点数单位通常为磅点)。
public PDFOperation(string type)
{
    SetPageSize(type);
    document = new Document(rect);
}

第2步:配置中文字体

目的:解决PDF中中文显示为方块的问题。

需要调用 SetBaseFont 方法传入系统字体路径,并指定 BaseFont.IDENTITY_H 以支持全字符集映射。随后通过 SetFont 将字体应用于具体文案。

// 示例调用:
pdf.SetBaseFont(@"C:\Windows\Fonts\SIMHEI.TTF");
pdf.SetFont(12);

第3步:执行文档生命周期操作

目的:打开文件流写入数据,并最终关闭以释放资源。

  1. 打开 (Open):传入 Stream 对象(如 FileStream),自动创建 PdfWriter 实例并启动文档写入流。
  2. 写入内容:在文档打开后,添加段落、图片或链接。
  3. 关闭 (Close):结束写入进程,保存并锁定文件句柄。
using (var fs = new FileStream("output.pdf", FileMode.Create))
{
    var pdf = new PDFOperation();
    pdf.Open(fs);
    pdf.SetBaseFont(@"C:\Windows\Fonts\SIMHEI.TTF");
    pdf.AddParagraph("Hello World!", 12, 0, 0, 0, 0);
    pdf.Close();
}

第4步:添加具体内容元素

类中提供了丰富的内容添加方法:

  • AddParagraph:支持纯文本、对齐方式(0居中/1居中/2靠右)、段前后间距及行间距控制。
  • AddImage:插入图片并支持绝对缩放(ScaleAbsolute)或按比例适配。
  • Anchor相关方法:创建超链接(Reference)或文档内部书签锚点(Name)。

完整源码

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

namespace DotNet.Utilities
{
    public class PDFOperation
    {
        #region 字段定义
        private Font font;
        private Rectangle rect; // 文档大小
        private Document document; // 文档对象
        private BaseFont basefont; // 字体
        #endregion

        #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 字体设置
        /// <summary>
        /// 设置基础字体(建议用于加载中文TrueType字体)
        /// </summary>
        public void SetBaseFont(string path)
        {
            try
            {
                basefont = BaseFont.CreateFont(path, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            }
            catch (Exception ex)
            {
                // 实际项目中应记录日志或抛出业务异常
            }
        }

        /// <summary>
        /// 应用字体样式
        /// </summary>
        public void SetFont(float size)
        {
            if (basefont == null) return;
            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 Open(Stream os)
        {
            PdfWriter.GetInstance(document, os);
            document.Open();
        }

        public void Close()
        {
            if (document != null && document.IsOpen())
            {
                document.Close();
            }
        }
        #endregion

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

        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; // 0=Left, 1=Center, 2=Right
            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
    }
}

常见问题排查

  • 编译错误:找不到类型或命名空间
    请确认 using iTextSharp.text; 已正确引入,且项目已添加 iTextSharp.dll 引用。
  • 中文乱码
    检查 SetBaseFont 路径是否正确指向系统中的字体文件。确保使用了 BaseFont.IDENTITY_H 而非 BaseFont.SIMPLIFIED_CHINESE(后者在某些版本中兼容性较差)。
  • 文件被占用
    确保在所有写入操作完成后调用 Close(),或在生成文件时使用 using 语句块包裹 FileStream,以便及时释放句柄。

以上就是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 算法库。