最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C++實(shí)現(xiàn)給PDF文檔添加文字水印

 更新時(shí)間:2023年11月24日 14:45:47   作者:E-iceblue  
這篇文章主要為大家詳細(xì)介紹了如何通過第三方國(guó)產(chǎn)庫(kù)Spire.PDF?for?C++來實(shí)現(xiàn)給PDF文檔添加文字水印,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

因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)庫(kù)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)將庫(kù)復(fù)制到程序中。

在 PDF 文檔中添加單行文字水印

Spire.PDF for C++ 沒有提供直接在PDF中插入水印的接口或類,但可以通過在PDF頁(yè)面上繪制文本并設(shè)置其透明度來模擬添加文字水印的效果。主要步驟如下:

  • 創(chuàng)建 PdfDocument 對(duì)象。
  • 使用 PdfDocument->LoadFromFile() 方法加載示例 PDF 文檔。
  • 使用 PdfDocument->GetPages()->GetItem() 方法獲取檔中的特定頁(yè)面。
  • 使用 PdfPageBase->GetCanvas()->TraslateTransform() 方法將頁(yè)面坐標(biāo)系平移至指定位置。
  • 使用 PdfPageBase->GetCanvas()->RotateTransform() 方法將坐標(biāo)系旋轉(zhuǎn)指定角度。(第四五步是為了確保水印以指定角度顯示在頁(yè)面中心位置。)
  • 使用 PdfPageBase->GetCanvas()->DrawString() 方法在PDF頁(yè)面上繪制文本水印。
  • 使用 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);
 
    //遍歷文檔中的頁(yè)面
    for (size_t i = 0; i < doc->GetPages()->GetCount(); i++)
    {
        //獲取指定頁(yè)面
        intrusive_ptr <PdfPageBase> page = doc->GetPages()->GetItem(i);
 
        //設(shè)置透明度
        page->GetCanvas()->SetTransparency(0.8);
 
        //將頁(yè)面坐標(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);
 
        //在頁(yè)面上繪制水印
        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 頁(yè)面添加平鋪水印。(其中參數(shù) rowNum 和 columnNum 指定平鋪水印的行數(shù)和列數(shù))。
  • 創(chuàng)建 PdfDocument 對(duì)象。
  • 使用 PdfDocument->LoadFromFile() 方法加載 PDF 示例文檔。
  • 遍歷文檔中的所有頁(yè)面,并調(diào)用自定義方法 InsertTiledTextWatermark() 將水印添加到每一頁(yè)。
  • 使用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);
 
    //獲取頁(yè)面高度和寬度
    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è)頁(yè)面的矩形
    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);
 
    //遍歷文檔中的頁(yè)面
    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++多態(tài)的全面講解

    C++多態(tài)的全面講解

    多態(tài)按字面的意思就是多種形態(tài)。當(dāng)類之間存在層次結(jié)構(gòu),并且類之間是通過繼承關(guān)聯(lián)時(shí),就會(huì)用到多態(tài)。C++?多態(tài)意味著調(diào)用成員函數(shù)時(shí),會(huì)根據(jù)調(diào)用函數(shù)的對(duì)象的類型來執(zhí)行不同的函數(shù)
    2022-06-06
  • C++?RAII在HotSpot?VM中的重要應(yīng)用解析

    C++?RAII在HotSpot?VM中的重要應(yīng)用解析

    RAII技術(shù)被認(rèn)為是C++中管理資源的最佳方法,進(jìn)一步引申,使用RAII技術(shù)也可以實(shí)現(xiàn)安全、簡(jiǎn)潔的狀態(tài)管理,編寫出優(yōu)雅的異常安全的代碼,這篇文章主要介紹了C++?RAII在HotSpot?VM中的重要應(yīng)用,需要的朋友可以參考下
    2023-09-09
  • c++中的內(nèi)聯(lián)函數(shù)inline用法實(shí)例

    c++中的內(nèi)聯(lián)函數(shù)inline用法實(shí)例

    在本篇文章里小編給大家整理的是關(guān)于c++中的內(nèi)聯(lián)函數(shù)inline用法實(shí)例以及相關(guān)知識(shí)點(diǎn),有需要的朋友們學(xué)習(xí)下。
    2019-09-09
  • VS?Code?C++?環(huán)境配置及?HelloWorld?程序(保姆教程)

    VS?Code?C++?環(huán)境配置及?HelloWorld?程序(保姆教程)

    文章詳細(xì)介紹了在Windows、macOS和Linux上配置VSCode的C++開發(fā)環(huán)境,并提供了創(chuàng)建、編譯、調(diào)試和使用CMake的步驟,還涵蓋了常見問題的解決方法和快速模板項(xiàng)目的獲取,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • 從c++標(biāo)準(zhǔn)庫(kù)指針萃取器談一下traits技法(推薦)

    從c++標(biāo)準(zhǔn)庫(kù)指針萃取器談一下traits技法(推薦)

    本篇文章基于gcc中標(biāo)準(zhǔn)庫(kù)源碼剖析一下標(biāo)準(zhǔn)庫(kù)中的模板類pointer_traits,并且以此為例理解一下traits技法,對(duì)c++ traits技法源碼分析感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • 老生常談C++getline使用方法

    老生常談C++getline使用方法

    下面小編就為大家?guī)硪黄仙U凜++getline使用方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • 利用C語(yǔ)言實(shí)現(xiàn)頁(yè)面置換算法的詳細(xì)過程

    利用C語(yǔ)言實(shí)現(xiàn)頁(yè)面置換算法的詳細(xì)過程

    一個(gè)好的頁(yè)面置換算法,應(yīng)具有較低的頁(yè)面更換頻率,從理論上講,應(yīng)該保留最近重復(fù)訪問的頁(yè)面,將以后都不再訪問或者很長(zhǎng)時(shí)間內(nèi)不再訪問的頁(yè)面調(diào)出,下面這篇文章主要給大家介紹了關(guān)于利用C語(yǔ)言實(shí)現(xiàn)頁(yè)面置換算法的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C++實(shí)現(xiàn)字符串和整數(shù)的相互轉(zhuǎn)換

    C++實(shí)現(xiàn)字符串和整數(shù)的相互轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)字符串和整數(shù)的相互轉(zhuǎn)換的方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定的幫助,需要的可以參考一下
    2023-01-01
  • C++內(nèi)存數(shù)據(jù)結(jié)構(gòu)與二進(jìn)制文件之間的序列化和反序列化方式

    C++內(nèi)存數(shù)據(jù)結(jié)構(gòu)與二進(jìn)制文件之間的序列化和反序列化方式

    這篇文章主要介紹了C++內(nèi)存數(shù)據(jù)結(jié)構(gòu)與二進(jìn)制文件之間的序列化和反序列化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 詳解C++中的const關(guān)鍵字及與C語(yǔ)言中const的區(qū)別

    詳解C++中的const關(guān)鍵字及與C語(yǔ)言中const的區(qū)別

    這篇文章主要介紹了C++中的const關(guān)鍵字及與C語(yǔ)言中const的區(qū)別,const將所修飾的變量對(duì)象轉(zhuǎn)化為常量,需要的朋友可以參考下
    2016-04-04

最新評(píng)論

门头沟区| 寿阳县| 合阳县| 普兰县| 罗平县| 班戈县| 托克托县| 屏东市| 射洪县| 罗山县| 维西| 乐山市| 容城县| 杂多县| 山阴县| 余江县| 郸城县| 南召县| 中西区| 建平县| 岳西县| 安宁市| 柏乡县| 迁安市| 丰城市| 宝山区| 哈尔滨市| 瑞金市| 子长县| 博兴县| 浏阳市| 浏阳市| 门头沟区| 雅江县| 宁强县| 拜城县| 梓潼县| 长海县| 灵武市| 南漳县| 邓州市|