3人参与 • 2026-08-07 • C/C++


#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模块。

qt6 引入了功能强大的 qt pdf 模块,为开发者提供了原生、跨平台的 pdf 文档处理能力,无需依赖第三方库。该模块基于 qt 的图形架构,能够高效地渲染、查看和打印 pdf 文件。
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)
这是最核心的类,负责管理 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。
用于精细控制页面渲染过程。
常用设置:
setrenderflags(qpdfdocumentrenderoptions::renderflags): 设置渲染标志,例如:
renderflag::none: 默认。renderflag::annotations: 渲染注释。renderflag::optimizedforlcd: 为 lcd 屏幕优化。setscaledsize(qsize size): 设置渲染输出的目标尺寸(像素)。如果与 pagepointsize 比例不一致,图像会被拉伸。qpdfdocument::load。qpdfdocumentrenderoptions 对象并设置参数。doc.render(pageindex, targetsize, options) 获得 qimage。qimage 可能包含透明背景(对应pdf空白区域)。如需白底,可将其绘制到另一个填充了白色的 qimage 上,如您分享的源码所示。qimage::setdotspermeterx/y() 设置图像分辨率,以控制打印或显示的物理尺寸精度。pagecount() 即可实现整个pdf的转换。close() 释放资源,尤其是在批量处理时。qpdfview 控件更为简单,它内部封装了文档加载、渲染、缩放、导航等功能。qpdfdocument 目前主要专注于渲染。如需复杂的文本提取、搜索功能,可能需要结合其他库或等待qt未来版本的增强。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用于配置页面渲染的选项,如缩放模式、旋转、裁剪等。
| 选项 | 方法 | 说明 |
|---|---|---|
| 缩放模式 | 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 | 获取颜色模式。 |
用于表示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 | 创建索引。 |
表示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 | 创建索引。 |
qt6 的 pdf 模块为桌面和嵌入式应用处理 pdf 提供了官方、高效的一站式解决方案。其核心在于 qpdfdocument 的加载与渲染能力。通过 render() 方法获取 qimage 后,开发者可以灵活地进行后续的图像处理、保存或显示。本文详解了其核心类与典型工作流程,并提供了可直接使用的代码示例。
以上就是qt实现将pdf文件转高清图片的完整指南的详细内容,更多关于qt pdf转图片的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论