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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:52:37