.net C# 打印pdf添加水印实现
工具类
using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
namespace Common
{
public static class PdfUtils
{
/// <summary>
/// PDF添加文字水印
/// 参数检查:检查水印内容、源文件路径和目标文件路径是否为空,若为空则直接返回源文件路径,与Java代码逻辑一致。
///读取和创建PDF对象:使用PdfReader读取源PDF文件,PdfStamper结合FileStream创建目标文件,用于写入添加水印后的内容。
///设置字体:通过BaseFont.CreateFont方法设置支持中文的字体,参数与Java版本保持一致,确保中文正常显示。
///设置透明度:创建PdfGState对象,设置FillOpacity属性为0.5f,实现水印半透明效果。
///遍历页面添加水印:遍历PDF的每一页,获取页面的上层内容(GetOverContent),通过双重循环平铺水印,设置字体、颜色、透明度,并使用ShowTextAligned方法在指定位置以45度角添加水印。
///异常处理和资源释放:捕获异常并输出错误信息,在finally块中关闭PdfStamper和PdfReader,释放资源,避免内存泄漏。
/// </summary>
/// <param name="waterMark">水印内容</param>
/// <param name="sourcePath">源文件路径</param>
/// <param name="targetPath">目标文件路径</param>
/// <param name="fontSize">字体大小</param>
/// <returns></returns>
public static string AddWatermark(string waterMark, string sourcePath, string targetPath, int fontSize)
{
if (string.IsNullOrWhiteSpace(waterMark) || string.IsNullOrWhiteSpace(sourcePath) || string.IsNullOrWhiteSpace(targetPath))
{
return sourcePath;
}
PdfReader reader = null;
PdfStamper stamp = null;
try
{
// 待加水印文件
reader = new PdfReader(sourcePath);
// 加完水印输出的文件
stamp = new PdfStamper(reader, new FileStream(targetPath, FileMode.Create));
// 设置字体(需要考虑pdf中文无法显示的问题),iTextSharp内置了一些中文字体,STSongStd-Light,STSong-Light
BaseFont font = BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
// 设置透明度
PdfGState pdfGState = new PdfGState();
pdfGState.FillOpacity = 0.5f; // 设置透明度为0.5,值的范围是0.0到1.0,其中0.0代表完全透明(即不可见),1.0代表完全不透明(即完全可见)
// 源PDF文件的总页数
int pageSize = reader.NumberOfPages;
// 循环对每页添加水印
for (int i = 1; i <= pageSize; i++)
{
// PdfContentByte under = stamp.GetUnderContent(i); // 水印在之前的文本下,文本会盖住水印,如果需要文本水印一起出现,不要使用该方法
PdfContentByte under = stamp.GetOverContent(i); // 水印在之前的文本上
// 平铺水印
for (int x = 100; x < 750; x += 200) // 控制水印在横向上的间距
{
for (int y = 100; y < 1000; y += 300) // 控制水印在纵向上的间距
{
under.BeginText(); // 开始
under.SetFontAndSize(font, fontSize); // 应用字体,并将字体大小改为40
under.SetColorFill(BaseColor.LIGHT_GRAY); // 设置字体颜色
under.SetGState(pdfGState); // 将透明度应用到水印里
under.ShowTextAligned(Element.ALIGN_CENTER, waterMark, x, y, 45);// 居中;水印内容;水印x坐标;水印y坐标;45°角
under.EndText();
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"添加水印时发生错误: {ex.Message}");
return sourcePath;
}
finally
{
if (stamp != null)
{
stamp.Close();
}
if (reader != null)
{
reader.Close();
}
}
return targetPath;
}
}
}
调用实现
// 添加水印
string fileFullName = "D:\\project\\code\\Att\\Templates\\111.pdf";
string targetFileName = "D:\\project\\code\\Att\\Templates\\222.pdf";
string path = PdfUtils.AddWatermark("预览", fileFullName, targetFileName, 40);
Response.Redirect("~/Att/Templates/" + targetFileName);
打印如下:
