关于 Qt多图生成多页PDF时发现超过20页后出现空白 的解决方法

发布时间:2026/11/3 2:18:02
关于 Qt多图生成多页PDF时发现超过20页后出现空白 的解决方法

若该文为原创文章,转载请注明出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/163860420

长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

Qt开发专栏:各种问题解决(点击传送门)


问题

生成工艺展示文件的时候,发现页面追加到约20页之后,后续空白。


定位问题思路

步骤一:生成工序图,展示页面图,绘制页码后的当前图,以及最终列表输出图关键节点排查

先存图在步骤测试:


确认代码没问题,继续
只使用工序,不带前面的首页,说明等等:


所以是在这里丢掉了:

步骤二:定位到后,检查循环

增加打印,避免说显示共享的问题:

进一步打印:

查看此时此刻内存:

基本是1.5GB失败了。
所以定位到问题了,这个代码是为了前后缓存用作他用,方便后续扩,现在页面较多的时候,最好是生成几页就几页进入pdf。

步骤三:发现减少内存也存在问题,进一步排查


此时内存只有800多MB:

步骤四:怀疑是虚拟内存问题

多次调试,发现可能是虚拟内存问题,程序堆栈来回分配变成碎片化了,切换64位测试:
32位mingw切换至64位可以了,测试直接干掉200多页:


解决

解决方法一:常规解决方法,优化缓存数据,不做多份,可一定程度解决,但经不住页面足够多的时候。

解决方法二:常规解决方法,优化缓存数据,优化QImage存储格式,内存消耗再减少,可一定程度解决,但经不住页面足够多的时候。

解决方法三:常规解决方法,增加QT支持较大内存运行,可一定程度解决,但经不住页面足够多的时候。

解决方法四:如果是32位程序,可切换至64位试一试,虚拟内存分配与物理内存不一样,可能碎片化无法分配连续QImage的内存。

解决方法五:以上多处优化1+2+3+4都可以,主要看应用使用到的上限,需要一个限制。

解决方法六(推荐终极方法):动态流式方法,生成页面的同时同步输出到pdf,这样一页或者几页来生成,内存中始终只有几页。

简单来说就是模块A一边生成图片a,图a的时候就抛出去给下一个外部模块B,外部模块再做操作生成图片b,再给下一个外部模块C,模块C再给pdf模块打开输出pdf,压入一页a,只剩pdf内存,中间流式a缓存清除,可能同时存在多条线流水线形式,但是始终同时只有几条线在内存中,可以直接完美解决,不过这种需要设计框架思维对模块化进行设计调整,从原来函数点一下实现到流水线的状态机自动控制,修改较大。
对于中大型工程项目,框架的设计远比代码本身更重要,理解为基于业务的构架设计,但在上位机这个领域,受限于传统原因,很少人去意识到构架设计(毕竟上位机没有构架师)。


本文章博客地址:https://hpzwl.blog.csdn.net/article/details/163860420