使用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
相关产品推荐
相关产品推荐

