C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > Qt PDF转图片

Qt实现将PDF文件转高清图片的完整指南

作者:小灰灰搞电子

本文主要和大家分享了使用Qt将PDF转换为高清图片的完整源码实现,主要功能包括实现PDF到图片的转换,支持自定义输出尺寸和DPI,自动处理透明背景等,有需要的小伙伴可以了解下

一、源码分享

1、效果展示

2、源码分享

#include <QScreen>
#include <QPdfDocument>
#include <QPdfDocumentRenderOptions>
#include <QImage>
#include <QFile>
#include <QDir>
#include <QGuiApplication>
#include <QPainter>


#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::pdfToHighResImage(const QString &pdfPath,
                                   const QString &imgPath,
                                   QSize size,int dpi)
{
    QPdfDocument doc;
    auto err = doc.load(pdfPath);
    if (err != QPdfDocument::Error::None)
    {
        qDebug() << "load pdf error code:" << err;
        return false;
    }

    // 校验自定义尺寸
    if (!size.isValid() || size.width() <= 0 || size.height() <= 0)
    {
        qDebug() << "input size width or height less zero!";
        doc.close();
        return false;
    }

    // 拆分路径,自动创建目录
    QFileInfo imageFileInfo(imgPath);
    // 获取后缀并判断格式
    QString suffix = imageFileInfo.suffix().toLower();
    QString imgFormat;
    int quality = -1;
    if (suffix == "png")
    {
        imgFormat = "PNG";
    }
    else if (suffix == "jpg" || suffix == "jpeg")
    {
        imgFormat = "JPG";
        quality = 100; // jpg最高画质防模糊
    }
    else
    {
        qDebug() << "unsupported image extensions, only png / jpg / jpeg are supported!";
        doc.close();
        return false;
    }
    // 只转换第0页(如需指定页码可再加pageIndex参数)
    int pageIdx = 0;
    qDebug()<<doc.pagePointSize(pageIdx);
    QPdfDocumentRenderOptions opts;
    opts.setRenderFlags(QPdfDocumentRenderOptions::RenderFlag::None );
    QImage img = doc.render(pageIdx, size, opts);
    if (img.isNull())
    {
        qDebug() << "page " << pageIdx + 1 << " rendering failed!";
        doc.close();
        return false;
    }
    QImage whiteBgImg(size, QImage::Format_RGB32); // RGB无透明通道
    whiteBgImg.fill(Qt::white); // 铺满纯白色背景
    QPainter painter(&whiteBgImg);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    painter.drawImage(0, 0, img); // 将带透明的PDF图绘制到白底上
    painter.end();
    // 替换原img,后续保存用白底图
    img = std::move(whiteBgImg);

    int dotsPerMeter = qRound(dpi / 25.4 * 1000);
    img.setDotsPerMeterX(dotsPerMeter);
    img.setDotsPerMeterY(dotsPerMeter);
    if (imgFormat == "PNG")
    {
        // PNG额外写入文本信息,看图软件可识别
        img.setText("DPI", QString::number(dpi));
    }
    bool saveOk;
    if (quality > 0)
        saveOk = img.save(imgPath, imgFormat.toUtf8().data(), quality);
    else
        saveOk = img.save(imgPath, imgFormat.toUtf8().data());

    if (!saveOk)
        qDebug() << "failed to save the image:" << imgPath;
    else
        qDebug() << "success to save the image:" << imgPath;

    doc.close();
    return saveOk;
}
void MainWindow::on_pushButton_clicked()
{
    pdfToHighResImage("L000137362.pdf", "L000137362.jpg", QSize(896,1534),300);
    pdfToHighResImage("L000137362.pdf", "L000137362.png", QSize(896,1534),300);
}

在pro中添加pdf模块。

二、pdf模块详解

Qt6 引入了功能强大的 Qt PDF 模块,为开发者提供了原生、跨平台的 PDF 文档处理能力,无需依赖第三方库。该模块基于 Qt 的图形架构,能够高效地渲染、查看和打印 PDF 文件。

1、模块概述与引入

模块组成

Qt PDF 模块主要包含以下核心类:

此外,该模块还提供了与 Qt Widgets 和 Qt Quick 集成的便捷类:

在项目中启用

在 Qt 项目文件 (.pro) 中,添加以下配置来引入 PDF 模块:

QT += pdf

对于 CMake 项目,则在 CMakeLists.txt 中链接对应的库:

find_package(Qt6 REQUIRED COMPONENTS Pdf)
target_link_libraries(your_target PRIVATE Qt6::Pdf)

2、核心类详解

QPdfDocument

这是最核心的类,负责管理 PDF 文档的生命周期。

关键方法:

错误处理:load 方法返回 QPdfDocument::Error 枚举值,应检查是否为 QPdfDocument::Error::None

 QPdfDocumentRenderOptions

用于精细控制页面渲染过程。

常用设置:

渲染流程与图像处理

  1. 加载文档:使用 QPdfDocument::load
  2. 配置渲染:创建 QPdfDocumentRenderOptions 对象并设置参数。
  3. 执行渲染:调用 doc.render(pageIndex, targetSize, options) 获得 QImage
  4. 后处理:得到的 QImage 可能包含透明背景(对应PDF空白区域)。如需白底,可将其绘制到另一个填充了白色的 QImage 上,如您分享的源码所示。
  5. 设置DPI:通过 QImage::setDotsPerMeterX/Y() 设置图像分辨率,以控制打印或显示的物理尺寸精度。

3、高级应用与注意事项

4、 核心类与API表格

QPdfDocument

QPdfDocument是PDF文档的容器,用于加载、解析和访问PDF内容。

类别方法/枚举说明
文档加载与状态Error load(const QString &fileName)从文件加载PDF文档,返回错误码。
Error load(QIODevice *device)从IO设备加载PDF文档。
void close()关闭当前文档,释放资源。
bool isLoaded() const返回文档是否已成功加载。
Error error() const返回最后一次操作的错误码。
QString errorString() const返回错误描述字符串。
Status status() const返回文档的当前状态(Null、Loading、Ready、Unloading、Error)。
页面信息int pageCount() const返回文档的总页数。
QSizeF pagePointSize(int pageIndex) const返回指定页面的尺寸(以点为单位,1点=1/72英寸)。
QSizeF pageSize(int pageIndex) const返回指定页面的尺寸(以毫米为单位)。
QString metaData(QPdfDocument::MetaDataField field) const获取文档元数据,如标题、作者、主题等。
渲染QImage render(int pageIndex, const QSize &imageSize, const QPdfDocumentRenderOptions &options = QPdfDocumentRenderOptions())将指定页面渲染为QImage。
QImage render(int pageIndex, const QSizeF &size, const QPdfDocumentRenderOptions &options = QPdfDocumentRenderOptions())重载版本,接受QSizeF尺寸。
导航与书签QPdfBookmarkModel *bookmarkModel() const返回书签模型,用于文档导航。
QPdfLinkModel *linkModel(int page) const返回指定页面的链接模型。
信号void statusChanged(QPdfDocument::Status status)文档状态改变时发出。
void pageCountChanged(int pageCount)页数改变时发出。
void errorChanged(QPdfDocument::Error error, const QString &description)发生错误时发出。
void passwordRequired()需要密码解密时发出。

QPdfDocumentRenderOptions

QPdfDocumentRenderOptions用于配置页面渲染的选项,如缩放模式、旋转、裁剪等。

选项方法说明
缩放模式void setScaledClipRect(const QRectF &rect)设置裁剪矩形(相对于页面尺寸的比例,0-1)。
QRectF scaledClipRect() const获取设置的裁剪矩形。
void setScaledSize(const QSizeF &size)设置渲染的目标尺寸(以点为单位)。
QSizeF scaledSize() const获取目标尺寸。
旋转void setRotation(QPdfDocumentRenderOptions::Rotation rotation)设置页面旋转角度(0°、90°、180°、270°)。
Rotation rotation() const获取旋转设置。
渲染标志void setRenderFlags(RenderFlags flags)设置渲染标志(如反走样、文本反走样等)。
RenderFlags renderFlags() const获取渲染标志。
颜色模式void setColorMode(ColorMode mode)设置颜色模式(Color、Grayscale、Monochrome)。
ColorMode colorMode() const获取颜色模式。

QPdfBookmarkModel

用于表示PDF文档的书签(目录)结构,通常与QTreeView等视图组件配合使用。

方法说明
QVariant data(const QModelIndex &index, int role) const override获取书签项的数据(如标题、页码)。
QModelIndex parent(const QModelIndex &child) const override返回父节点的索引。
int rowCount(const QModelIndex &parent = QModelIndex()) const override返回子项数量。
int columnCount(const QModelIndex &parent = QModelIndex()) const override返回列数(通常为1)。
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override创建索引。

QPdfLinkModel

表示PDF页面中的链接(超链接、文档内部跳转等)。

方法说明
QVariant data(const QModelIndex &index, int role) const override获取链接数据(如URL、目标页码、矩形区域)。
int rowCount(const QModelIndex &parent = QModelIndex()) const override返回链接数量。
QModelIndex parent(const QModelIndex &child) const override返回父节点索引(通常为无效索引)。
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override创建索引。

5. 总结

Qt6 的 PDF 模块为桌面和嵌入式应用处理 PDF 提供了官方、高效的一站式解决方案。其核心在于 QPdfDocument 的加载与渲染能力。通过 render() 方法获取 QImage 后,开发者可以灵活地进行后续的图像处理、保存或显示。本文详解了其核心类与典型工作流程,并提供了可直接使用的代码示例。

以上就是Qt实现将PDF文件转高清图片的完整指南的详细内容,更多关于Qt PDF转图片的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文