前言
我们时常会有一些零散的图片,而又想连续的查看,合并成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()
对象关闭