C#使用iTextSharp为PDF所有页面添加统一背景图
在使用C#生成或编辑PDF时,常遇到需要为所有页面添加统一背景图(如水印、信纸底纹)的需求。传统方法在内容超过一页时容易失效或无法保持连续性。本文演示如何使用iTextSharp的 PdfStamper 类遍历PDF的每一页,并在其底层(UnderContent)添加固定坐标的图片,从而确保每页均有完整的背景。
实现原理与准备工作
iTextSharp 允许通过 PdfStamper 对现有PDF进行修改。为了不影响原有文字内容的显示,需要将背景图绘制在页面的“底层”而非“上层”。具体做法是读取PDF文件,获取总页数,循环每一页调用 GetUnderContent(int pageNumber) 获取画布,然后添加图片对象。
操作前请确保项目中已引用 itextsharp.dll 以及 System.Drawing 命名空间,用于处理图像文件。
核心操作步骤
第1步:初始化PDF读写流与处理器
首先定义源PDF路径和输出保存路径。使用 PdfReader 读取原文件,并用 PdfStamper 包裹写入流以准备修改。
public void SetPdfBackground(string pdfFilePath)
{
// 定义输出路径,这里模拟生成一个新的PDF
string destFile = HttpContext.Current.Server.MapPath("sample.pdf");
// 创建文件流用于写入新PDF
FileStream stream = new FileStream(destFile, FileMode.Create, FileAccess.ReadWrite);
// 读取原始PDF
PdfReader reader = new PdfReader(pdfFilePath);
// 初始化 Stamper,用于修改内容
PdfStamper stamper = new PdfStamper(reader, stream);
第2步:加载背景图片
从本地磁盘加载背景图片文件,并将其转换为 iTextSharp 可用的 Image 实例。关键设置是 SetAbsolutePosition(0, 0),这将使图片相对于页面左下角定位,确保铺满整个页面区域(假设图片尺寸适配或超出页面)。
// 指定背景图片的路径
string imagePage = HttpContext.Current.Server.MapPath("../images/2012/bg2.png");
// 使用 System.Drawing 加载图片
System.Drawing.Image image = System.Drawing.Image.FromFile(imagePage);
// 转换为 iTextSharp Image 对象,格式设为 PNG 以支持透明通道
var img = Image.GetInstance(image, System.Drawing.Imaging.ImageFormat.Png);
// 设置绝对位置,原点通常对应页面左下脚
img.SetAbsolutePosition(0, 0);
第3步:遍历页面并添加背景
获取PDF的总页数,使用 for 循环从第1页遍历至最后一页。在每次迭代中,获取当前页的底层画布 GetUnderContent(current),并通过 AddImage(img) 将预置的背景图片绘制上去。注意这里不需要再次设置位置,因为之前已经固定了坐标。
int totalPage = reader.NumberOfPages;
for (int current = 1; current <= totalPage; current++)
{
// 获取当前页的底层内容画布(UnderContent)
// 这意味着背景会位于所有原有文字之下
var canvas = stamper.GetUnderContent(current);
// 添加背景图片
canvas.AddImage(img);
}
第4步:资源清理与保存
完成循环后,必须关闭 stamper 以将内存中的更改写入文件流。随后依次关闭 reader 和相关的文件流,释放资源。
stamper.Close();
reader.Close();
}
注意事项与排查
- 路径问题:示例中使用
HttpContext.Current.Server.MapPath是为了适应ASP.NET环境。如果在控制台或WPF应用中运行,请使用Path.Combine或相对路径指向实际的图片文件。 - 图片大小:如果背景图片尺寸小于PDF页面尺寸,可能会出现边缘留白。建议预处理图片使其分辨率大于A4纸打印所需DPI,或使用
img.ScaleAbsoluteWidth(height)等比例缩放以适应页面宽度。 - 性能考虑:对于几百页的大文档,此同步阻塞方式可能导致界面卡顿。可在后台线程中执行此方法。
- 版本兼容:iTextSharp 5.x 版本中,
PdfStamper的行为稳定。若升级到 iText 7 (.NET Core),API会有较大变化,需使用PdfDocument和Canvas类的新结构。
总结
通过 iTextSharp 的 PdfStamper 和底层画布机制,可以高效地为任意长度的PDF文档批量添加统一的背景图片或水印。该方法逻辑清晰,不破坏原有文本排版,是PDF后期处理的常用技巧。以上就是C#使用iTextSharp设置PDF所有页面背景图的详细内容,更多关于C# PDF编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













