C# iTextSharp PDF操作类封装与使用指南
在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步:执行文档生命周期操作
目的:打开文件流写入数据,并最终关闭以释放资源。
- 打开 (Open):传入
Stream对象(如FileStream),自动创建PdfWriter实例并启动文档写入流。 - 写入内容:在文档打开后,添加段落、图片或链接。
- 关闭 (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生成的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













