You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用QPdfWriter无法为PDF添加新页面的技术问题

Qt 6.2.0 多页PDF生成失败的解决办法

你的代码存在两个核心问题,导致QPdfWriter::newPage调用失败且只生成单页PDF:

  • 第一页无需提前调用newPage
    QPdfWriter初始化后默认已经创建了第一页,此时还未关联QPainter,直接调用writer.newPage()必然失败。

  • 页面切换流程错误
    你在绘制完一页后先调用painter.end(),断开了与QPdfWriter的关联,此时再调用writer.newPage()会因为没有活跃的绘图上下文而失败。正确做法是保持QPainter处于活跃状态,直接调用newPage创建新页面后继续绘制。

修改后的代码如下:

QFile outputFile(filename);
if (!outputFile.open(QIODevice::WriteOnly))
    return;

QPdfWriter writer(&outputFile);
writer.setPageSize(QPageSize(QPageSize::A5));
writer.setPageOrientation(QPageLayout::Landscape);

QPainter painter;
if (!painter.begin(&writer)) {
    qWarning() << "QPainter::begin failed";
    return;
}

// 第一页:直接绘制,无需提前调用newPage
QTextDocument page1;
page1.setHtml("<h1 align=center>Page 1</h1><p align=justify>Test page 1</p>");
page1.drawContents(&painter);

// 创建第二页:在painter活跃状态下调用newPage
if (!writer.newPage()) {
    qWarning() << "newPage failed";
} else {
    QTextDocument page2;
    page2.setHtml("<h1 align=center>Page 2</h1><p align=justify>Test page 2</p>");
    page2.drawContents(&painter);
}

// 最后统一结束painter
if (!painter.end()) {
    qWarning() << "QPainter::end failed";
}

关键说明

  • 始终保持QPainter与QPdfWriter的关联直到所有页面绘制完成,不要中途调用painter.end()。
  • 第一页直接绘制即可,QPdfWriter默认会生成初始页面。
  • 每一页绘制完成后,调用writer.newPage()创建新页面,之后直接绘制新内容即可。

内容的提问来源于stack exchange,提问作者BigMick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:22:48