GTK 3.0单页文档打印故障求助:Draw_Page未触发
GTK 3.0单页文档打印故障解决方案
问题背景
使用GTK 3.0开发的打印功能中,多页文档可正常打印,但单页文档调用Connect_and_Run后未进入Draw_Page函数,导致无法打印。调试输出显示单页场景下所有打印前的配置步骤都正常执行,但绘制回调完全未触发。
核心原因
GTK 3.0打印框架在处理单页文档时存在隐性逻辑:当nr_Pages设为1时,部分版本会跳过draw-page回调的触发,默认认为无需绘制(属于范围判定类的小bug)。
可行解决方案
1. 显式设置单页打印范围
在配置打印操作时,强制指定打印范围为第一页,避免GTK自动跳过:
Set_N_Pages (Print_Op, nr_Pages); Set_Use_Full_Page(Print_Op, true); Set_Unit (Print_Op, points); -- 新增单页处理逻辑 if nr_Pages = 1 then Print_Set.Set_Range(GTK_PRINT_RANGE_PAGES); Print_Set.Set_Page_Ranges(1, 1); end if; Print_Op.Set_Print_Settings(Print_Set); On_Draw_Page(Print_Op, Draw); Result := Connect_and_Run(Print_Op ,Action_Print_Dialog, Main_Window);
2. 调整回调绑定顺序
将On_Draw_Page的绑定提前到设置页数之前,确保GTK在初始化打印任务时就注册好回调:
-- 先绑定绘制回调 On_Draw_Page(Print_Op, Draw); -- 再配置打印参数 Set_N_Pages (Print_Op, nr_Pages); Set_Use_Full_Page(Print_Op, true); Set_Unit (Print_Op, points); Print_Op.Set_Print_Settings(Print_Set); Result := Connect_and_Run(Print_Op ,Action_Print_Dialog, Main_Window);
3. 临时修改页数规避逻辑
将单页文档的页数临时设为2,在Draw_Page中跳过第二页的绘制:
-- 设置页数时的修改 if nr_Pages = 1 then Set_N_Pages (Print_Op, 2); else Set_N_Pages (Print_Op, nr_Pages); end if; -- Draw_Page函数开头添加 procedure Draw (Self : access Gtk_Print_Operation_Record'Class; Context : not null access Gtk_Print_Context_Record'Class; Page_Nr : Gint) is begin if Page_Nr > 1 then return; -- 跳过第二页 end if; -- 原有绘制逻辑... end Draw;
验证方法
修改后测试单页文档,检查调试输出是否出现Draw_Page相关日志,确认打印任务是否正常生成并输出。
内容的提问来源于stack exchange,提问作者ldries46
相关产品推荐
相关产品推荐

