如何通過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頁面上繪製文本並設置其透明度來模擬添加文字水印的效果。主要步驟如下:

  1. 創建 PdfDocument 對象。
  2. 使用 PdfDocument->LoadFromFile() 方法加載示例 PDF 文檔。
  3. 使用 PdfDocument->GetPages()->GetItem() 方法獲取檔中的特定頁面。
  4. 使用 PdfPageBase->GetCanvas()->TraslateTransform() 方法將頁面座標系平移至指定位置。
  5. 使用 PdfPageBase->GetCanvas()->RotateTransform() 方法將座標系旋轉指定角度。(第四五步是爲了確保水印以指定角度顯示在頁面中心位置。
  6. 使用 PdfPageBase->GetCanvas()->DrawString() 方法在PDF頁面上繪製文本水印。
  7. 使用 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 文檔中添加多行水印。主要步驟如下:

  1. 創建自定義方法 InsertTiledTextWatermark(intrusive_ptr <PdfPageBase> page, wstring watermarkText, intrusive_ptr <PdfTrueTypeFont> font, int rowNum, int columnNum)來爲 PDF 頁面添加平鋪水印。(其中參數 rowNum 和 columnNum 指定平鋪水印的行數和列數)。
  2. 創建 PdfDocument 對象。
  3. 使用 PdfDocument->LoadFromFile() 方法加載 PDF 示例文檔。
  4. 遍歷文檔中的所有頁面,並調用自定義方法 InsertTiledTextWatermark() 將水印添加到每一頁。
  5. 使用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文檔添添加圖片水印

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章