(Qt) 图片合并到pdf

前言

我们时常会有一些零散的图片,而又想连续的查看,合并成pdf就是一个很好的选择。

各种语言,框架,三方包都能实现。本文通过Qt(cpp)的技术来实现。

本文直接给出具体函数,可以直接进行二次加工和修改,嵌入到gui图像化界面中作为一个小功能。

核心类 QPrinter QPainter

实现

Code

#include <QApplication>
#include <QDebug>
#include <QDesktopServices>
#include <QDir>
#include <QFile>
#include <QFileDialog>
#include <QFont>
#include <QPainter>
#include <QPixmap>
#include <QPrinter>

#define cdebug(x) qDebug() << x;

bool mergeImageToPdf(const QString& path, const QString& pdfName) {
    QDir targetPath(path);

    /// 确定生成路径,并把原先的文件remove一次
    QString pdfPath = targetPath.absoluteFilePath(pdfName + ".pdf");
    QFile::remove(pdfPath);

    /// 根据后缀筛选出对应文件
    /// 并根据名字排序
    QStringList namefile;
    namefile << "*.jpg";
    namefile << "*.png";
    namefile = targetPath.entryList(namefile, QDir::Files, QDir::Name);

    /// 打印和绘图对象
    QPrinter printer;
    QPainter painter;

    /// 设置基本属性
    printer.setPaperSize(QPrinter::A4);
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setPageMargins(0, 0, 0, 0, QPrinter::DevicePixel);
    printer.setOutputFileName(pdfPath);
    /// QPrinter 和 QPainter关联
    painter.begin(&printer);

    /// 设置首页的文字
    /// 同文件名
    painter.setFont(QFont("微软雅黑", 50));
    painter.drawText(printer.pageRect(), Qt::AlignCenter, pdfName);

    /// 绘制每一张图片
    for (auto s : namefile) {
        s = targetPath.absoluteFilePath(s);
        cdebug(s);

        QPixmap pixmap(s);
        /// 尺寸根据pdf的页面宽度缩放
        pixmap = pixmap.scaledToWidth(
            printer.width(), Qt::TransformationMode::SmoothTransformation);
        /// 生成新的一页并绘制上去
        printer.newPage();
        painter.drawPixmap(0, 0, pixmap.width(), pixmap.height(), pixmap);
    }
    /// 关闭绘制
    painter.end();

    cdebug("转换结束");
    return true;
}

int main(int argc, char* argv[]) {
    QApplication app(argc, argv);

    /// work
    {
        QString imgsPath = QFileDialog::getExistingDirectory(
            Q_NULLPTR, QCoreApplication::applicationDirPath());
        mergeImageToPdf(imgsPath, "文件名与首页文字");
        /// 中文路径会操作失败
        QDesktopServices::openUrl(imgsPath);
    }

    return app.exec();
}

执行思路

接口 bool mergeImageToPdf(const QString& path, const QString& pdfName)

接受图片资源路径和生成文档的标题

下面简单描述下操作流程

  • 先删除同名文件
  • 根据文件后缀名过滤出图片资源的路径
    • .jpg
    • .png
  • 定义QPrinter QPainter对象
  • 设定QPrinter对象的初始状态
  • QPrinter QPainter对象关联(开启)
    • QPainter::begin(QPrinter *)
  • 设置首页文字
    • 非必须
  • 遍历每一张图片并绘制
    • 生成QPixmap对象
    • 修改QPixmap对象的尺寸
    • QPrinter对象添加新的一页QPrinter::newPage()
    • QPixmap绘制上去QPainter::drawPixmap()
  • QPainter::end()对象关闭

效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述




END

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值