使用Gtk.PrintOperation.PRINT无对话框打印事件未触发如何解决?
无对话框GTK打印不触发事件的解决方法
调整步骤
- 确认打印配置中的打印机信息有效:跳过打印对话框后系统不会自动选择默认打印机,你保存的
printsettings.conf必须包含合法的打印机名称。可以在加载配置后加一行校验:
console.log('当前配置的打印机:', printSettings.getString('printer'))
如果返回空值,需要重新用对话框流程选一次打印机再导出配置,或者手动调用printSettings.setPrinter('你的打印机名称')指定打印机。如果配置为打印到文件,需要确认output-file路径存在且有写入权限。
- 放开
allow-async配置:注释掉的allow-async: true必须开启,node-gtk依赖这个参数正确派发打印相关的异步事件。 - 校验配置加载结果:
loadFile方法会返回布尔值表示加载是否成功,建议加判断避免配置文件异常:
const pageSetupLoaded = pageSetup.loadFile(Assets.absoluteFilePath('pagesetup.conf')) const settingsLoaded = printSettings.loadFile(Assets.absoluteFilePath('printsettings.conf')) if (!pageSetupLoaded || !settingsLoaded) { console.error('打印配置加载失败') return }
修改后完整代码
botao2.on('clicked', () => { let printSettings = new Gtk.PrintSettings(); let pageSetup = new Gtk.PageSetup(); // 校验配置加载结果 const pageSetupLoaded = pageSetup.loadFile(Assets.absoluteFilePath('pagesetup.conf')); const settingsLoaded = printSettings.loadFile(Assets.absoluteFilePath('printsettings.conf')); if (!pageSetupLoaded || !settingsLoaded) { console.error('打印配置加载失败'); return; } // 校验打印机配置是否存在 if (!printSettings.getString('printer')) { // 手动指定打印机,或者重新导出带打印机信息的配置 printSettings.setPrinter('你的实际打印机名称'); } let print = new Gtk.PrintOperation({ 'allow-async': true, // 开启异步支持 }); print.setUnit(Gtk.Unit.NONE); print.setPrintSettings(printSettings); print.setDefaultPageSetup(pageSetup); print.setUseFullPage(true); print.setShowProgress(true); console.log({ pageSetup, printSettings }); print.on('begin-print', (printContext, num) => { print.nPages = 1; width = Math.floor(printContext.getWidth()); height = Math.floor(printContext.getHeight()); }); print.on('draw-page', (printContext) => { console.log('draw-page', printContext); }); print.on('status-changed', (...args) => { console.log('status-changed', args); }); print.on('done', (res) => { console.log('done', res); }); console.log(print.run(Gtk.PrintOperationAction.PRINT)); });
内容的提问来源于stack exchange,提问作者rogeriojlle
相关产品推荐
相关产品推荐

