因PDF文檔具有較好的穩定性和相容性,現在越來越多的合同、研究論文、報告等都採用PDF格式。為了進一步保護這些重要文檔內容免受未經授權的複製或使用,我們可以添加水印以表明其狀態、所有權或用途。針對工作中可能出現的在 C++ 應用程式中給 PDF 文檔添加文字水印的需求,本文將詳細展示如何通過第三方國 ...
因PDF文檔具有較好的穩定性和相容性,現在越來越多的合同、研究論文、報告等都採用PDF格式。為了進一步保護這些重要文檔內容免受未經授權的複製或使用,我們可以添加水印以表明其狀態、所有權或用途。針對工作中可能出現的在 C++ 應用程式中給 PDF 文檔添加文字水印的需求,本文將詳細展示如何通過第三方國產庫Spire.PDF for C++來實現這一功能。
安裝 : Spire.PDF for C++是一款國產獨立 PDF 控制項,可實現 C++ 程式中創建、讀取、操作、編輯和轉換 PDF 文檔。推薦的安裝方式是在Visual Studio 中通過NuGet搜索 “spire.pdf.cpp”,然後點擊下載將其安裝到程式中。或者下載 Spire.PDF for C++ 到本地,解壓後手動將庫複製到程式中。
在 PDF 文檔中添加單行文字水印
Spire.PDF for C++ 沒有提供直接在PDF中插入水印的介面或類,但可以通過在PDF頁面上繪製文本並設置其透明度來模擬添加文字水印的效果。主要步驟如下:
- 創建 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() { //創建PdfDocument對象 intrusive_ptr <PdfDocument> doc = new PdfDocument(); //載入PDF文件 doc->LoadFromFile(L"協議.pdf"); //創建TrueType字體 intrusive_ptr <PdfTrueTypeFont> font = new PdfTrueTypeFont(L"黑體", 60.0f, PdfFontStyle::Bold, true); //創建筆刷 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 類可以實現平鋪水印效果。平鋪筆刷會生成一個平鋪圖案,用它重覆填充指定圖形區域即可在 PDF 文檔中添加多行水印。主要步驟如下:
- 創建自定義方法 InsertTiledTextWatermark(intrusive_ptr <PdfPageBase> page, wstring watermarkText, intrusive_ptr <PdfTrueTypeFont> font, int rowNum, int columnNum)來為 PDF 頁面添加平鋪水印。(其中參數 rowNum 和 columnNum 指定平鋪水印的行數和列數)。
- 創建 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(); //創建平鋪筆刷 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() { //創建PdfDocument對象 intrusive_ptr <PdfDocument> doc = new PdfDocument(); //載入PDF文件 doc->LoadFromFile(L"協議.pdf"); //指定水印文本 wstring text = L"內部文件"; //創建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文檔添添加圖片水印