前不久在上一篇博客中演示了如何在QT中创建并编辑PDF文件,参见:https://blog.csdn.net/thequitesunshine007/article/details/109720755
现在在其基础之上,想要增加背景水印。
代码如下:
#include <QtPrintSupport/QPrintDialog>
#include <QtPrintSupport/QPrinter>
#include <QPainter>
#include <QFont>
#include <QFontDialog>
#include <QColor>
#include <QPixmap>
/*
*@产生一张w*h大小的透明背景的QPixmap ,上面显示content水映
*/
QPixmap CreateWatermarkBg(uint16_t w, uint16_t h, QString content)
{
QPixmap pm(w,h);//一张新空图
pm.fill(Qt::transparent);//用透明色填充
QPainter painter(&pm);
int fontSize = 25/*25*/, spacing = 5;
QFont font("Ubuntu", fontSize, QFont::Thin);
font.setLetterSpacing(QFont::AbsoluteSpacing, spacing);
painter.setFont(font);
painter.setPen(QColor(200, 200, 200));
painter.translate(pm.width() / 2, -pm.width() / 2);//调整位置
QFontMetricsF fontMetrics(font);
qreal font_w = fontMetrics.width(content);
qreal font_h = fontMetrics.height();
qreal ang = 45.0;
painter.rotate(ang);
int project_Y = pm.width() * sin(ang) + pm.height() * sin(ang);//原图像Y坐标在新坐标系Y轴上的投影长度。
int project_X = pm.height()*sin(ang) + pm.width()*cos(ang);//原图像x坐标在新坐标系x轴上的投影长度。
int x_step = 1.5*font_w + 3*spacing; //在新坐标系X轴上的间距
int y_step = (3*font_h);
int rowCnt = project_Y / y_step + 1; //在新坐标系下写多少行
int colCnt = project_X / x_step; //在新坐标系下写多少列
for (int r = 0; r < rowCnt; r++)//在新坐标系下写多少行
{
for (int c = 0; c < colCnt + 1; c++)//在新坐标系下写多少列
{
painter.drawText(x_step * c, y_step * r,content);
}
}
return pm;
}
下面 CreateWatermarkBg得到的QPixmap画在PDF文件上即可。
//画水印
int w = 100, h = 100;
QPixmap watermask = CreateWatermarkBg(w,h, QString(“CSDN博客”));
float imgDisScale = 1.0;
painter.drawPixmap(QRect(0, 0, wimgDisScale,himgDisScale), watermask);
画完水印之后,在水印之上再画其他元素即可。反正CreateWatermarkBg得到的是透明背景,而且先画水印,再画其他元素时便会覆盖,等价于水印处于纸张的最底层。(图层最底层)