如何用C#实现PDF加水印与加密?

如何用C#实现PDF加水印与加密?

财务报告被截获、设计方案遭泄露...这类事故常因缺乏文档防护引发。作为.NET开发者,我们常被要求实现:

1. 为PDF添加溯源水印(如"内部资料-张三-2025")

2. 设置密码防线防止未授权查看
但实现过程中容易遇到:水印被轻易去除、弱密码遭暴力破解等问题。这里将分享用C#代码拆解双重防护实现方案

一、工具选型

AGPL协议

免费版限10页

👉 选型建议:个人项目推荐PDFSharp,企业项目建议购买Spire.PDF商业授权

二、实战代码

▎Step1:添加旋转文字水印(示例用Spire.PDF)

// 👉 关键点:设置水印透明度与旋转角度
PdfDocument doc = new PdfDocument();
doc.LoadFromFile("原始文件.pdf");

// 水印文字样式
PdfFont font = new PdfFont(PdfFontFamily.Helvetica, **30f**);
PdfBrush brush = new PdfSolidBrush(Color.FromArgb(**50**, 255, 0, 0)); //透明度50

// 在每页添加水印
foreach (PdfPageBase page in doc.Pages) {
    // 计算旋转中心点
    float x = page.Canvas.ClientSize.Width / 2;
    float y = page.Canvas.ClientSize.Height / 2;
    
    // 创建旋转画布(45度)
    page.Canvas.TranslateTransform(x, y);
    page.Canvas.RotateTransform(**-45**);
    page.Canvas.TranslateTransform(-x, -y);
    
    // 绘制水印文字
    page.Canvas.DrawString("机密文件", font, brush, x - 100, y - 20);
}

▎Step2:插入防截图图像水印

// 👉 关键点:使用位图叠加模式
PdfImage watermark = PdfImage.FromFile("logo.png");
foreach (PdfPageBase page in doc.Pages) {
    // 设置水印图片位置(右下角)
    float x = page.Canvas.ClientSize.Width - **watermark.Width - 20**;
    float y = **20**;
    
    // 设置叠加透明度
    page.Canvas.SetTransparency(**0.3f**, 0.3f);
    page.Canvas.DrawImage(watermark, x, y);
}

▎Step3:设置AES-128双密码防护

// 👉 开放密码=123,权限密码=admin(禁止打印)
doc.Security.Encrypt(
    "123",   //用户密码(打开文件用)
    "admin", //所有者密码(控制权限)
    PdfPermissionsFlags.**CopyContent | PdfPermissionsFlags.Print**, 
    PdfEncryptionKeySize.Key128Bit
);

三、安全进阶

1️⃣ 动态水印防御

// 随机水印位置生成算法
Random rand = new Random();
float x = rand.Next(0, pageWidth - watermarkWidth);
float y = rand.Next(0, pageHeight - watermarkHeight);

2️⃣ 密码生成黄金三原则

• 长度≥12位(如MyP@ss_2024!Doc

• 混合大小写+数字+特殊符号

• 采用密钥库管理而非硬编码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容