当前位置: 代码网 > it编程>编程语言>C/C++ > Qt实现将PDF文件转高清图片的完整指南

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

2026年08月07日 C/C++ 我要评论
一、源码分享1、效果展示2、源码分享#include <qscreen>#include <qpdfdocument>#include <qpdfdocumentrend

一、源码分享

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 模块主要包含以下核心类:

  • qpdfdocument: 用于加载、解析和获取 pdf 文档的元数据(如页数、作者、标题)及页面内容。它是操作 pdf 的入口。
  • qpdfselection: 处理文档中的文本选择。
  • qpdflink: 表示文档内的链接(如目录跳转、url)。
  • qpdfbookmarkmodel: 提供文档书签(大纲)的模型,便于集成到树形视图。
  • qpdfpagenavigator: 辅助进行页面导航。

此外,该模块还提供了与 qt widgets 和 qt quick 集成的便捷类:

  • qquickpdfdocumentqquickpdfpage (qt quick)
  • qpdfview (qt widgets): 一个功能完整的 pdf 查看器控件。

在项目中启用

在 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(const qstring &filename) / load(qiodevice *device): 从文件或设备加载 pdf。
  • status(): 返回加载状态 (qpdfdocument::status)。
  • pagecount(): 获取文档总页数。
  • pagepointsize(int pageindex): 获取指定页面的尺寸(以点为单位,1点=1/72英寸)。
  • render(int pageindex, qsize imagesize, qpdfdocumentrenderoptions options = qpdfdocumentrenderoptions()): 核心方法,将指定页面渲染为 qimage
  • metadata(qpdfdocument::metadatafield field): 获取文档元数据,如标题、作者。
  • close(): 关闭文档,释放资源。

错误处理:load 方法返回 qpdfdocument::error 枚举值,应检查是否为 qpdfdocument::error::none

 qpdfdocumentrenderoptions

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

常用设置:

  • setrenderflags(qpdfdocumentrenderoptions::renderflags): 设置渲染标志,例如:
    • renderflag::none: 默认。
    • renderflag::annotations: 渲染注释。
    • renderflag::optimizedforlcd: 为 lcd 屏幕优化。
  • setscaledsize(qsize size): 设置渲染输出的目标尺寸(像素)。如果与 pagepointsize 比例不一致,图像会被拉伸。

渲染流程与图像处理

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

3、高级应用与注意事项

  • 多页处理:循环 pagecount() 即可实现整个pdf的转换。
  • 性能优化:渲染大尺寸或高dpi图像较耗时,建议在后台线程进行。
  • 内存管理:及时调用 close() 释放资源,尤其是在批量处理时。
  • 与qpdfview集成:对于需要交互式查看的场景,直接使用 qpdfview 控件更为简单,它内部封装了文档加载、渲染、缩放、导航等功能。
  • 文本提取qpdfdocument 目前主要专注于渲染。如需复杂的文本提取、搜索功能,可能需要结合其他库或等待qt未来版本的增强。

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转图片的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com