随着 PDF 文档类型的日益多样化,您可能会需要对机密信息进行保护。尽管 PDF 的许多其他安全选项可用于确保机密信息的安全,但最常见的方法是为PDF文档添加自定义水印。在本文中,您将学习如何使用 Spire.PDF for C++ 在 C++ 中为 PDF 添加单行或多行文本水印。
安装 Spire.PDF for C++
有两种方法可以将 Spire.PDF for C++ 集成到您的应用程序中。一种方法是通过 NuGet 安装它,另一种方法是从我们的网站下载包并将库复制到您的程序中。通过 NuGet 安装更简单,更推荐使用。您可以通过访问以下链接找到更多详细信息。
如何将 Spire. PDF for C++ 集成到 C++ 程序中
将单行文本水印添加到 PDF
Spire.PDF for C++ 不提供负责在 PDF 文件中插入水印的接口或类。但您可以在每页上绘制类似“机密”、“请勿复制”或“草稿”的文本,以模拟水印效果。以下是向 PDF 文档添加单行文本水印的步骤。
- 创建一个 PdfDocument 对象。
- 使用 PdfDocument->LoadFromFile() 方法加载示例 PDF 文档。
- 使用 PdfDocument->GetPages()->GetItem() 方法从文档中获取特定页面。
- 使用 PdfPageBase->GetCanvas()->TraslateTransform() 方法将坐标系转换为指定坐标。
- 使用 PdfPageBase->GetCanvas()->RotateTransform() 方法将坐标系逆时针旋转45度。 此步骤和上面的步骤确保水印将以45度角出现在页面中间。
- 使用 PdfPageBase->GetCanvas()->DrawString() 方法在页面上绘制文本水印。
- 使用 PdfDocument->SaveToFile() 方法将文档保存到不同的 PDF 文件。
- C++
#include "Spire.Pdf.o.h";
using namespace std;
using namespace Spire::Pdf;
using namespace Spire::Common;
int main()
{
//指定输入文件和输出文件路径
wstring inputFilePath = L"C:\\Users\\Administrator\\Desktop\\示例文档.pdf";
wstring outputFilePath = L"Output\\添加单行文本水印.pdf";
//创建PdfDocument对象
PdfDocument* doc = new PdfDocument();
//加载PDF文件
doc->LoadFromFile(inputFilePath.c_str());
//创建true字体类型
PdfTrueTypeFont* font = new PdfTrueTypeFont(L"宋体", 50.0f, PdfFontStyle::Bold, true);
//创建一个笔刷
PdfBrush* brush = PdfBrushes::GetDarkGray();
//指定水印文本
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++)
{
//获取特定页面
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(outputFilePath.c_str());
doc->Close();
delete doc;
}
将多行文本水印添加到 PDF
要实现平铺水印效果,可以使用 PdfTilingBrush 类。平铺笔刷生成一个图案,用它重复填充某个图形区域即可实现平铺效果。以下是向 PDF 文档添加平铺文本水印的步骤。
- 创建自定义方法 InsertTiledTextWatermark(PdfPageBase* page, wstring watermarkText, 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;
using namespace Spire::Common;
static void InsertTiledTextWatermark(PdfPageBase* page, wstring watermarkText, 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();
//创建平铺笔刷
PdfTilingBrush* brush = new PdfTilingBrush(new SizeF(width / columnNum, height / rowNum));
brush->GetGraphics()->SetTransparency(0.5f);
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()
{
//指定输入文件和输出文件路径
wstring inputFilePath = L"C:\\Users\\Administrator\\Desktop\\示例文档.pdf";
wstring outputFilePath = L"Output\\添加多行文本水印.pdf";
//创建PdfDocument对象
PdfDocument* doc = new PdfDocument();
//加载PDF文件
doc->LoadFromFile(inputFilePath.c_str());
//指定水印文本
wstring text = L"请勿复制";
//创建true字体类型
PdfTrueTypeFont* font = new PdfTrueTypeFont(L"宋体", 20.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(outputFilePath.c_str());
doc->Close();
delete doc;
}
申请临时 License
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。