图片水印通常是出现在电子文档背景中的标识(如 logo 或图案),用于表明内容的版权归属。为 pdf 文档添加图片水印,可以在一定程度上防止数据被未经授权地使用或修改。
本文将介绍如何在 c# 和 vb.net 中,通过编程的方式为 pdf 添加图片水印。
环境准备
在开始之前,你需要在 .net 项目中引入一个支持 pdf 操作的类库(以 dll 形式提供)。
常见的引入方式有两种:
- 下载对应的库文件(dll)并手动添加到项目引用中
- 通过 nuget 包管理器进行安装
完成以上配置后,即可开始进行 pdf 水印的相关开发。
pm> install-package spire.pdf
为 pdf 添加图片水印
下面介绍为 pdf 文档添加图片水印的基本实现步骤:
- 创建 pdf 文档对象,并加载需要处理的 pdf 文件
- 读取作为水印的图片文件
- 遍历文档中的每一页
- 在当前页面上设置图片为背景(水印),并调整其位置和大小
- 将处理后的文档保存为新的 pdf 文件
示例代码如下:
using spire.pdf;
using system.drawing;
namespace addimagewatermark
{
class program
{
static void main(string[] args)
{
// 创建 pdfdocument 对象
pdfdocument document = new pdfdocument();
// 加载示例 pdf 文档
document.loadfromfile(@"c:\users\administrator\desktop\sample.pdf");
// 加载图片(水印图片)
image image = image.fromfile(@"c:\users\administrator\desktop\logo.png");
// 获取图片的宽度和高度
int imgwidth = image.width;
int imgheight = image.height;
// 遍历 pdf 的每一页
for (int i = 0; i < document.pages.count; i++)
{
// 获取当前页面的宽度和高度
float pagewidth = document.pages[i].actualsize.width;
float pageheight = document.pages[i].actualsize.height;
// 设置背景透明度(0~1,值越小越透明)
document.pages[i].backgroudopacity = 0.3f;
// 将图片设置为当前页面的背景(水印)
document.pages[i].backgroundimage = image;
// 计算并设置图片在页面中的居中位置
rectangle rect = new rectangle(
(int)(pagewidth - imgwidth) / 2,
(int)(pageheight - imgheight) / 2,
imgwidth,
imgheight
);
document.pages[i].backgroundregion = rect;
}
// 保存生成的 pdf 文件
document.savetofile("addimagewatermark.pdf");
// 关闭文档
document.close();
}
}
}方法补充
在 c# 里给 pdf 文件打上图片水印,主要有两种思路:一是直接读取文件路径的简单水印(spire.pdf);二是在 pdf 内容层实现精细控制和兼容的推荐做法(itext 7 / aspose.pdf)。综合来看,追求简单高效可选 spire.pdf;需要精细控制、在 .net core 下开发或确保最高兼容性,推荐 itext 7;预算充足且追求工业级稳定,aspose.pdf 是很好的选择。
具体区别可以参考下面这个对比表格:
| 维度 | spire.pdf | itext 7 | aspose.pdf |
|---|---|---|---|
实现方式 (base / core) | 直接设置背景图片 | pdfcanvas 在内容层绘制 | stamp 对象实现图章 |
| 许可证/费用 | 商业 (有免费版限制) | agpl / 商业 | 商业 |
| 项目适用性 | 新 .net 项目起始推荐 | .net core(兼容) 和跨平台推荐 | 工业级、企业版兼容性选型 |
| 代码复杂度 | 较低 (api 封装高) | 中 (需处理 canvas 和坐标系) | 中 |
| 适用场景 | 快速打标、替换背景图 | 版权水印、精细分布水印 | 矩阵、旋转、复杂排版要求 |
1.spire.pdf:背景图片水印 (最简单,推荐备选)
通过 backgroundimage 属性直接为页面添加背景图片,并可以设置背景透明度和位置。
安装 nuget 包
install-package spire.pdf
背景水印代码示例:基于 spire.pdf 的实现方式比较直观:加载 pdf 文件后,遍历每一页,为其设置背景图片,并可以自定义背景透明度和位置。
using spire.pdf;
using system.drawing;
class program
{
static void main(string[] args)
{
pdfdocument document = new pdfdocument();
document.loadfromfile("input.pdf");
// 加载图片
image image = image.fromfile("watermark.png");
// 遍历所有页面
for (int i = 0; i < document.pages.count; i++)
{
// 设置背景透明度
document.pages[i].backgroudopacity = 0.3f;
// 设置背景图片
document.pages[i].backgroundimage = image;
// 设置背景位置(居中)
float pagewidth = document.pages[i].actualsize.width;
float pageheight = document.pages[i].actualsize.height;
// 偏移量(相对左下角)居中右上角漂移
int imgwidth = image.width;
int imgheight = image.height;
// 计算居中位置
int x = (int)((pagewidth - imgwidth) / 2);
int y = (int)((pageheight - imgheight) / 2);
document.pages[i].backgroundregion = new rectangle(x, y, imgwidth, imgheight);
}
document.savetofile("output_spire.pdf");
document.close();
}
}代码说明:代码会遍历 pdf 的每一页,并将图片作为背景水印居中放置,同时可以设置透明度。
2.itext 7:pdfcanvas 内容层水印 (推荐首选,兼容性最好)
这是基于最新版本 itext 7 的最佳实践,通过 pdfcanvas 在内容层绘制,确保水印始终显示在文档最上层。尤其适合 .net core 等跨平台场景。
安装 nuget 包
install-package itext7
图片水印代码示例:通过创建 pdfcanvas 对象直接在文档的“上层内容流”上绘制水印,这是最推荐的做法,尤其适合 .net core / .net 5+ 环境。这种方式能确保水印始终显示在文档最上方。
using itext.kernel.geom;
using itext.kernel.pdf;
using itext.kernel.pdf.canvas;
using itext.layout;
using itext.io.image;
class program
{
static void main(string[] args)
{
// 1. 打开 pdf 文档 (只读/写入双重)
using (pdfdocument pdfdoc = new pdfdocument(new pdfreader("input.pdf"), new pdfwriter("output_itext7.pdf")))
{
imagedata imgdata = imagedatafactory.create("watermark.png");
// 2. 遍历每一页
for (int i = 1; i <= pdfdoc.getnumberofpages(); i++)
{
pdfpage page = pdfdoc.getpage(i);
pdfcanvas canvas = new pdfcanvas(page);
canvas.savestate();
// 设置水印透明度 (pdf 图形状态)
pdfextgstate gstate = new pdfextgstate().setfillopacity(0.5f);
canvas.setextgstate(gstate);
// 3. 获取页面尺寸 (左下角为原点)
rectangle pagesize = page.getpagesize();
float x = pagesize.getwidth() / 2;
float y = pagesize.getheight() / 2;
// 4. 绘制带旋转和居中的图片
canvas.addimage(imgdata, x, y, true);
canvas.restorestate();
canvas.release();
}
}
}
}代码说明:pdfcanvas 提供了低级别的绘图指令,让水印精确绘制在 pdf 的图形流中。通过 pdfextgstate 可以轻松控制透明度。
3.aspose.pdf:pdffilestamp 对象水印 (工业级)
使用 pdffilestamp 和 stamp 对象直接为 pdf 添加图片图章,这个方法在 aspose.pdf 中非常稳定,定位精准。
安装 nuget 包
install-package aspose.pdf
图片水印代码示例:通过 stamp 对象将图片绑定为水印,并可以精细控制其旋转角度、放置位置和大小。
using aspose.pdf;
using aspose.pdf.facades;
class program
{
static void main(string[] args)
{
// 加载 pdf 文档
document doc = new document("input.pdf");
// 用于添加图章的 facade 类
pdffilestamp stamppdf = new pdffilestamp(doc);
// 创建图章对象并绑定图片
aspose.pdf.facades.stamp astamp = new aspose.pdf.facades.stamp();
astamp.bindimage("watermark.png");
astamp.isbackground = true; // 作为背景
astamp.rotation = 90; // 旋转角度
astamp.setorigin(100, 100); // 左下角坐标 (单位: 磅)
astamp.setimagesize(200, 200); // 设置大小
stamppdf.addstamp(astamp);
stamppdf.save("output_aspose.pdf");
stamppdf.close();
doc.close();
}
}总结
通过以上方法,你可以在 c# 中轻松为 pdf 文档添加图片水印。核心思路其实很简单:为每一页设置背景图片,并通过透明度控制实现水印效果。在此基础上,你还可以根据实际需求灵活调整水印的位置、大小和透明度,甚至扩展为平铺或局部水印。整体实现成本低、可控性强,非常适合用于文档保护、品牌展示以及自动化处理等场景。
到此这篇关于c#代码实现在pdf文件中添加图片水印的文章就介绍到这了,更多相关c# pdf添加图片水印内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论