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

QPdfWriter生成0字节空白PDF文件问题求助

解决QPdfWriter生成0字节空白PDF的问题

问题核心原因

你代码里提前调用pdf.newPage()是导致空文件的关键:QPdfWriter实例化后默认会自动创建第一页,手动调用newPage()会生成一个空白新页,后续绘制操作实际在这个新页上,但因流程顺序问题,内容未被正确写入文件,最终生成0字节空文件。

另外你使用的图片尺寸(5905x4724)超过了A4横向(600DPI下宽度约4961像素)的页面范围,会导致图片超出可视区域,但这不是生成空文件的原因。

解决方案

  1. 移除多余的newPage()调用
    删除pdf.newPage();这一行,让绘制操作直接在默认创建的第一页进行。

  2. 检查QPainter初始化状态
    调用pnt.begin(&pdf)后判断返回值,确保绘制上下文成功创建,避免因初始化失败导致无内容写入。

  3. 适配图片到页面尺寸
    使用QPainter::drawImage的重载方法,将图片缩放到页面范围内,避免内容超出可视区域。

修改后的代码示例

QPdfWriter pdf("test.pdf");
pdf.setTitle("test image");
pdf.setCreator("My App");
pdf.setPageSize(QPageSize(QPageSize::A4));
pdf.setPageOrientation(QPageLayout::Landscape);
pdf.setResolution(600);
// pdf.setPageMargins(QMargins(30, 30, 30, 30));

QPainter pnt;
// 检查绘制上下文是否初始化成功
if (!pnt.begin(&pdf)) {
    // 可添加错误处理,比如打印日志提示
    return;
}

// 获取页面可用绘制矩形
QRect pageRect = pdf.pageLayout().paintRect();
// 将图片按比例缩放到页面范围内
pnt.drawImage(pageRect, img, img.rect());

// 绘制文本,确保在页面可视范围内
pnt.drawText(100, 100, "Hello World");

pnt.end();

img.save("test.tiff", nullptr, -1);

额外注意事项

  • 确保程序对目标文件路径有写入权限,避免因权限问题导致文件生成失败。
  • 如果需要生成多页PDF,需在完成当前页绘制后,再调用newPage()创建下一页。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:24:57