天天看点

QT中为PDF添加水印

前不久在上一篇博客中演示了如何在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得到的是透明背景,而且先画水印,再画其他元素时便会覆盖,等价于水印处于纸张的最底层。(图层最底层)

继续阅读