使用C++實現(xiàn)給PDF文檔添加文字水印
因PDF文檔具有較好的穩(wěn)定性和兼容性,現(xiàn)在越來越多的合同、研究論文、報告等都采用PDF格式。為了進一步保護這些重要文檔內容免受未經(jīng)授權的復制或使用,我們可以添加水印以表明其狀態(tài)、所有權或用途。針對工作中可能出現(xiàn)的在 C++ 應用程序中給 PDF 文檔添加文字水印的需求,本文將詳細展示如何通過第三方國產(chǎn)庫Spire.PDF for C++來實現(xiàn)這一功能。
安裝 : Spire.PDF for C++是一款國產(chǎn)獨立 PDF 控件,可實現(xiàn) C++ 程序中創(chuàng)建、讀取、操作、編輯和轉換 PDF 文檔。推薦的安裝方式是在Visual Studio 中通過NuGet搜索 “spire.pdf.cpp”,然后點擊下載將其安裝到程序中?;蛘呦螺d Spire.PDF for C++ 到本地,解壓后手動將庫復制到程序中。
在 PDF 文檔中添加單行文字水印
Spire.PDF for C++ 沒有提供直接在PDF中插入水印的接口或類,但可以通過在PDF頁面上繪制文本并設置其透明度來模擬添加文字水印的效果。主要步驟如下:
- 創(chuàng)建 PdfDocument 對象。
- 使用 PdfDocument->LoadFromFile() 方法加載示例 PDF 文檔。
- 使用 PdfDocument->GetPages()->GetItem() 方法獲取檔中的特定頁面。
- 使用 PdfPageBase->GetCanvas()->TraslateTransform() 方法將頁面坐標系平移至指定位置。
- 使用 PdfPageBase->GetCanvas()->RotateTransform() 方法將坐標系旋轉指定角度。(第四五步是為了確保水印以指定角度顯示在頁面中心位置。)
- 使用 PdfPageBase->GetCanvas()->DrawString() 方法在PDF頁面上繪制文本水印。
- 使用 PdfDocument->SaveToFile() 方法保存結果文檔。
C++代碼:
#include "Spire.Pdf.o.h";
using namespace std;
using namespace Spire::Pdf;
int main()
{
//創(chuàng)建PdfDocument對象
intrusive_ptr <PdfDocument> doc = new PdfDocument();
//加載PDF文件
doc->LoadFromFile(L"協(xié)議.pdf");
//創(chuàng)建TrueType字體
intrusive_ptr <PdfTrueTypeFont> font = new PdfTrueTypeFont(L"黑體", 60.0f, PdfFontStyle::Bold, true);
//創(chuàng)建筆刷
intrusive_ptr <PdfBrush> brush = PdfBrushes::GetSkyBlue();
//指定水印文本
wstring text = L"內部文件";
//測量水印文本大小
SizeF textSize = font->MeasureString(text.c_str());
//計算兩個偏移量,用于計算坐標系的平移量
float offset1 = (float)(textSize.GetWidth() * sqrt(2) / 4);
float offset2 = (float)(textSize.GetHeight() * sqrt(2) / 4);
//遍歷文檔中的頁面
for (size_t i = 0; i < doc->GetPages()->GetCount(); i++)
{
//獲取指定頁面
intrusive_ptr <PdfPageBase> page = doc->GetPages()->GetItem(i);
//設置透明度
page->GetCanvas()->SetTransparency(0.8);
//將頁面坐標系平移至指定位置
page->GetCanvas()->TranslateTransform(page->GetCanvas()->GetSize()->GetWidth() / 2 - offset1 - offset2, page->GetCanvas()->GetSize()->GetHeight() / 2 + offset1 - offset2);
//逆時針旋轉坐標系45度
page->GetCanvas()->RotateTransform(-45);
//在頁面上繪制水印
page->GetCanvas()->DrawString(text.c_str(), font, brush, 0, 0, new PdfStringFormat(PdfTextAlignment::Left));
}
//保存結果文檔
doc->SaveToFile(L"Output\\文字水印.pdf");
doc->Close();
}單行水印效果:

在 PDF 文檔中添加多行文字水印
使用Spire.PDF for C++提供的 PdfTilingBrush 類可以實現(xiàn)平鋪水印效果。平鋪筆刷會生成一個平鋪圖案,用它重復填充指定圖形區(qū)域即可在 PDF 文檔中添加多行水印。主要步驟如下:
- 創(chuàng)建自定義方法 InsertTiledTextWatermark(intrusive_ptr <PdfPageBase> page, wstring watermarkText, intrusive_ptr <PdfTrueTypeFont> font, int rowNum, int columnNum)來為 PDF 頁面添加平鋪水印。(其中參數(shù) rowNum 和 columnNum 指定平鋪水印的行數(shù)和列數(shù))。
- 創(chuàng)建 PdfDocument 對象。
- 使用 PdfDocument->LoadFromFile() 方法加載 PDF 示例文檔。
- 遍歷文檔中的所有頁面,并調用自定義方法 InsertTiledTextWatermark() 將水印添加到每一頁。
- 使用PdfDocument->SaveToFile()方法保存結果文檔。
C++代碼:
#include "Spire.Pdf.o.h";
using namespace std;
using namespace Spire::Pdf;
static void InsertTiledTextWatermark(intrusive_ptr <PdfPageBase> page, wstring watermarkText, intrusive_ptr <PdfTrueTypeFont> font, int rowNum, int columnNum)
{
//測量水印文本大小
SizeF textSize = font->MeasureString(watermarkText.c_str());
//計算兩個偏移量,用于計算坐標系的平移量
float offset1 = (float)(textSize.GetWidth() * sqrt(2) / 4);
float offset2 = (float)(textSize.GetHeight() * sqrt(2) / 4);
//獲取頁面高度和寬度
float height = page->GetActualSize()->GetHeight();
float width = page->GetActualSize()->GetWidth();
//創(chuàng)建平鋪筆刷
intrusive_ptr <PdfTilingBrush> brush = new PdfTilingBrush(new SizeF(width / columnNum, height / rowNum));
brush->GetGraphics()->SetTransparency(0.3f);
brush->GetGraphics()->TranslateTransform(brush->GetSize()->GetWidth() / 2 - offset1 - offset2, brush->GetSize()->GetHeight() / 2 + offset1 - offset2);
brush->GetGraphics()->RotateTransform(-45);
//在筆刷上繪制水印文字
brush->GetGraphics()->DrawString(watermarkText.c_str(), font, PdfBrushes::GetRed(), 0, 0, new PdfStringFormat(PdfTextAlignment::Left));
//使用平鋪筆刷繪制一個覆蓋整個頁面的矩形
page->GetCanvas()->DrawRectangle(brush, new RectangleF(new PointF(0, 0), page->GetActualSize()));
}
int main()
{
//創(chuàng)建PdfDocument對象
intrusive_ptr <PdfDocument> doc = new PdfDocument();
//加載PDF文件
doc->LoadFromFile(L"協(xié)議.pdf");
//指定水印文本
wstring text = L"內部文件";
//創(chuàng)建TrueType字體
intrusive_ptr <PdfTrueTypeFont> font = new PdfTrueTypeFont(L"黑體", 30.0f, PdfFontStyle::Bold, true);
//遍歷文檔中的頁面
for (size_t i = 0; i < doc->GetPages()->GetCount(); i++)
{
//調用自定義方法來插入多行文本水印
InsertTiledTextWatermark(doc->GetPages()->GetItem(i), text.c_str(), font, 3, 3);
}
//保存結果文件
doc->SaveToFile(L"Output\\多行水印.pdf");
doc->Close();
}多行水印效果:

此外還可參考:C++給PDF文檔添添加圖片水印
到此這篇關于使用C++實現(xiàn)給PDF文檔添加文字水印的文章就介紹到這了,更多相關C++ PDF添加水印內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
c++中的內聯(lián)函數(shù)inline用法實例
在本篇文章里小編給大家整理的是關于c++中的內聯(lián)函數(shù)inline用法實例以及相關知識點,有需要的朋友們學習下。2019-09-09
VS?Code?C++?環(huán)境配置及?HelloWorld?程序(保姆教程)
文章詳細介紹了在Windows、macOS和Linux上配置VSCode的C++開發(fā)環(huán)境,并提供了創(chuàng)建、編譯、調試和使用CMake的步驟,還涵蓋了常見問題的解決方法和快速模板項目的獲取,感興趣的朋友跟隨小編一起看看吧2025-12-12
C++內存數(shù)據(jù)結構與二進制文件之間的序列化和反序列化方式
這篇文章主要介紹了C++內存數(shù)據(jù)結構與二進制文件之間的序列化和反序列化方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
詳解C++中的const關鍵字及與C語言中const的區(qū)別
這篇文章主要介紹了C++中的const關鍵字及與C語言中const的區(qū)別,const將所修飾的變量對象轉化為常量,需要的朋友可以參考下2016-04-04

