使用C++實(shí)現(xiàn)給PDF文檔添加文字水印
因PDF文檔具有較好的穩(wěn)定性和兼容性,現(xiàn)在越來越多的合同、研究論文、報(bào)告等都采用PDF格式。為了進(jìn)一步保護(hù)這些重要文檔內(nèi)容免受未經(jīng)授權(quán)的復(fù)制或使用,我們可以添加水印以表明其狀態(tài)、所有權(quán)或用途。針對(duì)工作中可能出現(xiàn)的在 C++ 應(yīng)用程序中給 PDF 文檔添加文字水印的需求,本文將詳細(xì)展示如何通過第三方國(guó)產(chǎn)庫Spire.PDF for C++來實(shí)現(xiàn)這一功能。
安裝 : Spire.PDF for C++是一款國(guó)產(chǎn)獨(dú)立 PDF 控件,可實(shí)現(xiàn) C++ 程序中創(chuàng)建、讀取、操作、編輯和轉(zhuǎn)換 PDF 文檔。推薦的安裝方式是在Visual Studio 中通過NuGet搜索 “spire.pdf.cpp”,然后點(diǎn)擊下載將其安裝到程序中?;蛘呦螺d Spire.PDF for C++ 到本地,解壓后手動(dòng)將庫復(fù)制到程序中。
在 PDF 文檔中添加單行文字水印
Spire.PDF for C++ 沒有提供直接在PDF中插入水印的接口或類,但可以通過在PDF頁面上繪制文本并設(shè)置其透明度來模擬添加文字水印的效果。主要步驟如下:
- 創(chuàng)建 PdfDocument 對(duì)象。
- 使用 PdfDocument->LoadFromFile() 方法加載示例 PDF 文檔。
- 使用 PdfDocument->GetPages()->GetItem() 方法獲取檔中的特定頁面。
- 使用 PdfPageBase->GetCanvas()->TraslateTransform() 方法將頁面坐標(biāo)系平移至指定位置。
- 使用 PdfPageBase->GetCanvas()->RotateTransform() 方法將坐標(biāo)系旋轉(zhuǎn)指定角度。(第四五步是為了確保水印以指定角度顯示在頁面中心位置。)
- 使用 PdfPageBase->GetCanvas()->DrawString() 方法在PDF頁面上繪制文本水印。
- 使用 PdfDocument->SaveToFile() 方法保存結(jié)果文檔。
C++代碼:
#include "Spire.Pdf.o.h"; using namespace std; using namespace Spire::Pdf; int main() { //創(chuàng)建PdfDocument對(duì)象 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"內(nèi)部文件"; //測(cè)量水印文本大小 SizeF textSize = font->MeasureString(text.c_str()); //計(jì)算兩個(gè)偏移量,用于計(jì)算坐標(biāo)系的平移量 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); //設(shè)置透明度 page->GetCanvas()->SetTransparency(0.8); //將頁面坐標(biāo)系平移至指定位置 page->GetCanvas()->TranslateTransform(page->GetCanvas()->GetSize()->GetWidth() / 2 - offset1 - offset2, page->GetCanvas()->GetSize()->GetHeight() / 2 + offset1 - offset2); //逆時(shí)針旋轉(zhuǎn)坐標(biāo)系45度 page->GetCanvas()->RotateTransform(-45); //在頁面上繪制水印 page->GetCanvas()->DrawString(text.c_str(), font, brush, 0, 0, new PdfStringFormat(PdfTextAlignment::Left)); } //保存結(jié)果文檔 doc->SaveToFile(L"Output\\文字水印.pdf"); doc->Close(); }
單行水印效果:
在 PDF 文檔中添加多行文字水印
使用Spire.PDF for C++提供的 PdfTilingBrush 類可以實(shí)現(xiàn)平鋪水印效果。平鋪筆刷會(huì)生成一個(gè)平鋪圖案,用它重復(fù)填充指定圖形區(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 對(duì)象。
- 使用 PdfDocument->LoadFromFile() 方法加載 PDF 示例文檔。
- 遍歷文檔中的所有頁面,并調(diào)用自定義方法 InsertTiledTextWatermark() 將水印添加到每一頁。
- 使用PdfDocument->SaveToFile()方法保存結(jié)果文檔。
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) { //測(cè)量水印文本大小 SizeF textSize = font->MeasureString(watermarkText.c_str()); //計(jì)算兩個(gè)偏移量,用于計(jì)算坐標(biāo)系的平移量 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)); //使用平鋪筆刷繪制一個(gè)覆蓋整個(gè)頁面的矩形 page->GetCanvas()->DrawRectangle(brush, new RectangleF(new PointF(0, 0), page->GetActualSize())); } int main() { //創(chuàng)建PdfDocument對(duì)象 intrusive_ptr <PdfDocument> doc = new PdfDocument(); //加載PDF文件 doc->LoadFromFile(L"協(xié)議.pdf"); //指定水印文本 wstring text = L"內(nèi)部文件"; //創(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++) { //調(diào)用自定義方法來插入多行文本水印 InsertTiledTextWatermark(doc->GetPages()->GetItem(i), text.c_str(), font, 3, 3); } //保存結(jié)果文件 doc->SaveToFile(L"Output\\多行水印.pdf"); doc->Close(); }
多行水印效果:
此外還可參考:C++給PDF文檔添添加圖片水印
到此這篇關(guān)于使用C++實(shí)現(xiàn)給PDF文檔添加文字水印的文章就介紹到這了,更多相關(guān)C++ PDF添加水印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++動(dòng)態(tài)數(shù)組類的封裝實(shí)例
這篇文章主要介紹了C++動(dòng)態(tài)數(shù)組類的封裝,很重要的概念,需要的朋友可以參考下2014-08-08C語言求質(zhì)數(shù)的幾種簡(jiǎn)單易懂方式
這篇文章主要介紹了C語言求質(zhì)數(shù)的幾種簡(jiǎn)單易懂方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12C/C++?Qt?StatusBar底部狀態(tài)欄應(yīng)用教程
Qt窗體中默認(rèn)會(huì)附加一個(gè)QstatusBar組件,狀態(tài)欄組件位于主窗體的最下方,其作用是提供一個(gè)工具提示功能。本文主要介紹了StatusBar底部狀態(tài)欄的應(yīng)用教程,需要的同學(xué)可以學(xué)習(xí)一下2021-12-12關(guān)于Visual Studio無法打開源文件"stdio.h"問題
這篇文章主要介紹了關(guān)于Visual Studio無法打開源文件"stdio.h"問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04C/C++中關(guān)于std::string的compare陷阱示例詳解
這篇文章主要給大家介紹了關(guān)于C/C++中關(guān)于std::string的compare陷阱的相關(guān)資料,文中先對(duì)C/C++中的std::string進(jìn)行了簡(jiǎn)單的介紹,通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11