C#代碼實(shí)現(xiàn)在PDF文件中添加圖片水印
圖片水印通常是出現(xiàn)在電子文檔背景中的標(biāo)識(shí)(如 Logo 或圖案),用于表明內(nèi)容的版權(quán)歸屬。為 PDF 文檔添加圖片水印,可以在一定程度上防止數(shù)據(jù)被未經(jīng)授權(quán)地使用或修改。
本文將介紹如何在 C# 和 VB.NET 中,通過(guò)編程的方式為 PDF 添加圖片水印。
環(huán)境準(zhǔn)備
在開(kāi)始之前,你需要在 .NET 項(xiàng)目中引入一個(gè)支持 PDF 操作的類(lèi)庫(kù)(以 DLL 形式提供)。
常見(jiàn)的引入方式有兩種:
- 下載對(duì)應(yīng)的庫(kù)文件(DLL)并手動(dòng)添加到項(xiàng)目引用中
- 通過(guò) NuGet 包管理器進(jìn)行安裝
完成以上配置后,即可開(kāi)始進(jìn)行 PDF 水印的相關(guān)開(kāi)發(fā)。
PM> Install-Package Spire.PDF
為 PDF 添加圖片水印
下面介紹為 PDF 文檔添加圖片水印的基本實(shí)現(xiàn)步驟:
- 創(chuàng)建 PDF 文檔對(duì)象,并加載需要處理的 PDF 文件
- 讀取作為水印的圖片文件
- 遍歷文檔中的每一頁(yè)
- 在當(dāng)前頁(yè)面上設(shè)置圖片為背景(水?。⒄{(diào)整其位置和大小
- 將處理后的文檔保存為新的 PDF 文件
示例代碼如下:
using Spire.Pdf;
using System.Drawing;
namespace AddImageWatermark
{
class Program
{
static void Main(string[] args)
{
// 創(chuàng)建 PdfDocument 對(duì)象
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 的每一頁(yè)
for (int i = 0; i < document.Pages.Count; i++)
{
// 獲取當(dāng)前頁(yè)面的寬度和高度
float pageWidth = document.Pages[i].ActualSize.Width;
float pageHeight = document.Pages[i].ActualSize.Height;
// 設(shè)置背景透明度(0~1,值越小越透明)
document.Pages[i].BackgroudOpacity = 0.3f;
// 將圖片設(shè)置為當(dāng)前頁(yè)面的背景(水?。?
document.Pages[i].BackgroundImage = image;
// 計(jì)算并設(shè)置圖片在頁(yè)面中的居中位置
Rectangle rect = new Rectangle(
(int)(pageWidth - imgWidth) / 2,
(int)(pageHeight - imgHeight) / 2,
imgWidth,
imgHeight
);
document.Pages[i].BackgroundRegion = rect;
}
// 保存生成的 PDF 文件
document.SaveToFile("AddImageWatermark.pdf");
// 關(guān)閉文檔
document.Close();
}
}
}方法補(bǔ)充
在 C# 里給 PDF 文件打上圖片水印,主要有兩種思路:一是直接讀取文件路徑的簡(jiǎn)單水?。⊿pire.PDF);二是在 PDF 內(nèi)容層實(shí)現(xiàn)精細(xì)控制和兼容的推薦做法(iText 7 / Aspose.PDF)。綜合來(lái)看,追求簡(jiǎn)單高效可選 Spire.PDF;需要精細(xì)控制、在 .NET Core 下開(kāi)發(fā)或確保最高兼容性,推薦 iText 7;預(yù)算充足且追求工業(yè)級(jí)穩(wěn)定,Aspose.PDF 是很好的選擇。
具體區(qū)別可以參考下面這個(gè)對(duì)比表格:
| 維度 | Spire.PDF | iText 7 | Aspose.PDF |
|---|---|---|---|
實(shí)現(xiàn)方式 (Base / Core) | 直接設(shè)置背景圖片 | PdfCanvas 在內(nèi)容層繪制 | Stamp 對(duì)象實(shí)現(xiàn)圖章 |
| 許可證/費(fèi)用 | 商業(yè) (有免費(fèi)版限制) | AGPL / 商業(yè) | 商業(yè) |
| 項(xiàng)目適用性 | 新 .NET 項(xiàng)目起始推薦 | .NET Core(兼容) 和跨平臺(tái)推薦 | 工業(yè)級(jí)、企業(yè)版兼容性選型 |
| 代碼復(fù)雜度 | 較低 (API 封裝高) | 中 (需處理 Canvas 和坐標(biāo)系) | 中 |
| 適用場(chǎng)景 | 快速打標(biāo)、替換背景圖 | 版權(quán)水印、精細(xì)分布水印 | 矩陣、旋轉(zhuǎn)、復(fù)雜排版要求 |
1.Spire.PDF:背景圖片水印 (最簡(jiǎn)單,推薦備選)
通過(guò) BackgroundImage 屬性直接為頁(yè)面添加背景圖片,并可以設(shè)置背景透明度和位置。
安裝 NuGet 包
Install-Package Spire.PDF
背景水印代碼示例:基于 Spire.PDF 的實(shí)現(xiàn)方式比較直觀:加載 PDF 文件后,遍歷每一頁(yè),為其設(shè)置背景圖片,并可以自定義背景透明度和位置。
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");
// 遍歷所有頁(yè)面
for (int i = 0; i < document.Pages.Count; i++)
{
// 設(shè)置背景透明度
document.Pages[i].BackgroudOpacity = 0.3f;
// 設(shè)置背景圖片
document.Pages[i].BackgroundImage = image;
// 設(shè)置背景位置(居中)
float pageWidth = document.Pages[i].ActualSize.Width;
float pageHeight = document.Pages[i].ActualSize.Height;
// 偏移量(相對(duì)左下角)居中右上角漂移
int imgWidth = image.Width;
int imgHeight = image.Height;
// 計(jì)算居中位置
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();
}
}代碼說(shuō)明:代碼會(huì)遍歷 PDF 的每一頁(yè),并將圖片作為背景水印居中放置,同時(shí)可以設(shè)置透明度。
2.iText 7:PdfCanvas 內(nèi)容層水印 (推薦首選,兼容性最好)
這是基于最新版本 iText 7 的最佳實(shí)踐,通過(guò) PdfCanvas 在內(nèi)容層繪制,確保水印始終顯示在文檔最上層。尤其適合 .NET Core 等跨平臺(tái)場(chǎng)景。
安裝 NuGet 包
Install-Package itext7
圖片水印代碼示例:通過(guò)創(chuàng)建 PdfCanvas 對(duì)象直接在文檔的“上層內(nèi)容流”上繪制水印,這是最推薦的做法,尤其適合 .NET Core / .NET 5+ 環(huán)境。這種方式能確保水印始終顯示在文檔最上方。
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. 打開(kāi) PDF 文檔 (只讀/寫(xiě)入雙重)
using (PdfDocument pdfDoc = new PdfDocument(new PdfReader("input.pdf"), new PdfWriter("output_itext7.pdf")))
{
ImageData imgData = ImageDataFactory.Create("watermark.png");
// 2. 遍歷每一頁(yè)
for (int i = 1; i <= pdfDoc.GetNumberOfPages(); i++)
{
PdfPage page = pdfDoc.GetPage(i);
PdfCanvas canvas = new PdfCanvas(page);
canvas.SaveState();
// 設(shè)置水印透明度 (PDF 圖形狀態(tài))
PdfExtGState gState = new PdfExtGState().SetFillOpacity(0.5f);
canvas.SetExtGState(gState);
// 3. 獲取頁(yè)面尺寸 (左下角為原點(diǎn))
Rectangle pageSize = page.GetPageSize();
float x = pageSize.GetWidth() / 2;
float y = pageSize.GetHeight() / 2;
// 4. 繪制帶旋轉(zhuǎn)和居中的圖片
canvas.AddImage(imgData, x, y, true);
canvas.RestoreState();
canvas.Release();
}
}
}
}代碼說(shuō)明:PdfCanvas 提供了低級(jí)別的繪圖指令,讓水印精確繪制在 PDF 的圖形流中。通過(guò) PdfExtGState 可以輕松控制透明度。
3.Aspose.PDF:PdfFileStamp 對(duì)象水印 (工業(yè)級(jí))
使用 PdfFileStamp 和 Stamp 對(duì)象直接為 PDF 添加圖片圖章,這個(gè)方法在 Aspose.PDF 中非常穩(wěn)定,定位精準(zhǔn)。
安裝 NuGet 包
Install-Package Aspose.PDF
圖片水印代碼示例:通過(guò) Stamp 對(duì)象將圖片綁定為水印,并可以精細(xì)控制其旋轉(zhuǎn)角度、放置位置和大小。
using Aspose.Pdf;
using Aspose.Pdf.Facades;
class Program
{
static void Main(string[] args)
{
// 加載 PDF 文檔
Document doc = new Document("input.pdf");
// 用于添加圖章的 Facade 類(lèi)
PdfFileStamp stampPdf = new PdfFileStamp(doc);
// 創(chuàng)建圖章對(duì)象并綁定圖片
Aspose.Pdf.Facades.Stamp aStamp = new Aspose.Pdf.Facades.Stamp();
aStamp.BindImage("watermark.png");
aStamp.IsBackground = true; // 作為背景
aStamp.Rotation = 90; // 旋轉(zhuǎn)角度
aStamp.SetOrigin(100, 100); // 左下角坐標(biāo) (單位: 磅)
aStamp.SetImageSize(200, 200); // 設(shè)置大小
stampPdf.AddStamp(aStamp);
stampPdf.Save("output_aspose.pdf");
stampPdf.Close();
doc.Close();
}
}總結(jié)
通過(guò)以上方法,你可以在 C# 中輕松為 PDF 文檔添加圖片水印。核心思路其實(shí)很簡(jiǎn)單:為每一頁(yè)設(shè)置背景圖片,并通過(guò)透明度控制實(shí)現(xiàn)水印效果。在此基礎(chǔ)上,你還可以根據(jù)實(shí)際需求靈活調(diào)整水印的位置、大小和透明度,甚至擴(kuò)展為平鋪或局部水印。整體實(shí)現(xiàn)成本低、可控性強(qiáng),非常適合用于文檔保護(hù)、品牌展示以及自動(dòng)化處理等場(chǎng)景。
到此這篇關(guān)于C#代碼實(shí)現(xiàn)在PDF文件中添加圖片水印的文章就介紹到這了,更多相關(guān)C# PDF添加圖片水印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# XML與Json之間相互轉(zhuǎn)換實(shí)例詳解
這篇文章主要介紹了C# XML與Json之間相互轉(zhuǎn)換實(shí)例詳解,大家參考使用吧2013-11-11
基于Unity制作一個(gè)簡(jiǎn)易的計(jì)算器
今天主要和大家分享如何使用Unity制作計(jì)算器,難度中等,可以用來(lái)學(xué)習(xí),或者當(dāng)成其他項(xiàng)目的小組件導(dǎo)入。當(dāng)然,也可以導(dǎo)出來(lái),發(fā)布到網(wǎng)頁(yè)端,來(lái)做一個(gè)嵌入式工具也可以。感興趣的可以跟隨小編學(xué)習(xí)一下2022-03-03
C#預(yù)處理指令之#line,#pragma warning 詳細(xì)解析
#line 指令可能由生成過(guò)程中的自動(dòng)中間步驟使用。例如,如果行從原始的源代碼文件中移除,但是您仍希望編譯器基于文件中的原始行號(hào)生成輸出,則可以移除行,然后用 #line 模擬原始行號(hào)2014-01-01
Visual Studio C#創(chuàng)建windows服務(wù)程序
用Visual C#創(chuàng)建Windows服務(wù)不是一件困難的事,本文就將指導(dǎo)你一步一步創(chuàng)建一個(gè)Windows服務(wù)并使用它,本文主要介紹了Visual Studio C#創(chuàng)建windows服務(wù)程序,感興趣的可以了解一下2024-01-01
Unity UGUI教程之實(shí)現(xiàn)滑頁(yè)效果
使用UGUI提供的ScrollRect和ScrollBar組件實(shí)現(xiàn)基本滑動(dòng)以及自己控制每次移動(dòng)一頁(yè)來(lái)達(dá)到滑頁(yè)的效果。具體實(shí)現(xiàn)思路請(qǐng)參考下本教程2016-04-04
C#實(shí)現(xiàn)將Excel表格轉(zhuǎn)換為圖片(JPG/?PNG)
Excel表格可能會(huì)因?yàn)椴煌O(shè)備或字體缺失等問(wèn)題,導(dǎo)致格式錯(cuò)亂或數(shù)據(jù)顯示異常,轉(zhuǎn)換為圖片后,能確保數(shù)據(jù)的排版等保持一致,下面我們看看如何使用C#實(shí)現(xiàn)將Excel表格轉(zhuǎn)換為圖片吧2025-04-04

