miniblink49 打印完全指南:从弹窗打印到 PDF 导出
miniblink49 打印完全指南:从弹窗打印到 PDF 导出
【免费下载链接】miniblink49a lighter, faster browser kernel of blink to integrate HTML UI in your app. 一个小巧、轻量的浏览器内核,用来取代wke和libcef项目地址: https://gitcode.com/GitHub_Trending/mi/miniblink49
在自绘界面应用里加一个"打印网页"按钮,多数团队卡在打印弹窗、纸张适配和 PDF 导出上。miniblink49 把这套流程封装成了几个 C API,配合内置的设置面板页面,几行调用就能让应用拥有和浏览器一样完整的 miniblink49 打印体验。
功能全景:一眼看懂它能做什么 📋
- 带预览的打印流程:
mbUtilPrint直接拉起 miniblink49 自带的打印设置窗口,纸张、方向、份数都有现成 UI,不用自己画。 - PDF 导出:
mbUtilPrintToPdf按页回调 PDF 数据,多页文档也能逐页拿全。 - 位图输出:
mbUtilPrintToBitmap把页面渲染成位图,适合做缩略图、预览图。 - 静默打印:
mbUtilsSilentPrint传入 JSON 设置直接走队列,全程无窗口,适合服务器端或后台任务。 - 打印机枚举:核心实现同时遍历本地和网络打印机,虚拟 PDF 打印机也能被选中。
- 默认打印参数:
mbDefaultPrinterSettings一次设置方向、边距、份数、纸张,应用内全局生效。 - 打印过程钩子:
mbOnPrinting按"开始/预览/打印"三阶段回调并给出当前 DPI 和缩放,方便做进度条或拦截。
核心代码集中在mbvip/printing/目录(Printing、WkePrinting、PdfViewerPlugin 等),API 声明在mbvip/core/mb.h。
场景化上手:从"我想实现 X"到跑通 🖨️
打印一份报表:拉起带预览的设置窗口
用户点"打印"时调用mbUtilPrint,第二个参数指定要打印的帧,第三个参数可以不传(用默认设置):
mbPrintSettings s = {}; s.structSize = sizeof(mbPrintSettings); s.isLandscape = TRUE; // 报表横向排版 mbUtilPrint(view, frame, &s); // 拉起 miniblink49 打印设置窗口窗口内的设置页是仓库自带的 PrintingPage.htm,改完点确认就走系统打印队列,无需再写一个对话框。
三步导出带多页的 PDF
导出用异步回调拿数据,每页一份 buffer,攒完写文件即可:
// onPdf 是 mbPrintPdfDataCallback 类型的回调 mbUtilPrintToPdf(view, frame, &s, onPdf, userData); void onPdf(mbWebView v, void* p, const mbPdfDatas* d) { for (int i = 0; i < d->count; i++) fwrite(d->datas[i], 1, d->sizes[i], outFile); // 逐页写入 PDF 文件 }注意mbPdfDatas里的指针只在回调内有效,数据必须当场拷贝走。
后台任务:一行静默打印
批量任务不需要窗口,把设置序列化成 JSON 字符串直接投递:
const char* json = "{\"isLandscape\":1,\"paperType\":9,\"copies\":2}"; mbUtilsSilentPrint(view, json);细节配置:把默认值调成你需要的样子 ⚙️
mbPrintSettings是 PDF 与位图导出共用的结构体,常用字段如下:
| 配置项 | 作用 | 推荐值/示例 |
|---|---|---|
dpi | 渲染分辨率,决定 PDF 清晰度 | 96(屏幕预览)或 300(正式打印) |
width/height | 输出尺寸,单位随 dpi 换算 | A4 纵向 @96dpi 约 794×1123 |
marginLeft等四项 | 页边距,边距过大会裁掉内容 | 0~48,按版式微调 |
isLandscape | 横向/纵向排版 | 报表建议TRUE |
isPrintBackgroud | 是否输出背景色和图片 | 彩色报表务必TRUE |
isPrintPageHeadAndFooter | 是否输出页眉页脚(页码、标题) | 正式文档FALSE,内部文档TRUE |
踩坑记录:这些问题你可能也会遇到 🛠️
- 打印出来背景全白→ 大概率是
isPrintBackgroud没开,很多代码模板默认是关的 → 置为TRUE再导一次。 - PDF 里中文变成方块或缺字→ 渲染时找不到字体,常见于精简版 Windows 镜像 → 在系统字体目录补上中文字体即可,代码不用改。
- 导出的 PDF 比预期大一圈→
dpi没设,尺寸被按默认值放大了 → 显式填dpi = 96,width/height按纸张换算。 - 同一份设置,有的打印机内容不居中→ 特定品牌(如 HP)会按自己的默认纸张重排 → 设置窗口里手动选一次纸张类型再打印,面板会记住该值。
- 回调里拿到的 PDF 数据"消失"了→ 别慌,指针是临时内存,不能跨回调保存 → 在
onPdf内部立即fwrite或memcpy。
进阶玩法:再榨一点性能 ⚡
- 设置窗口和预览视图是按需创建的,只在用户首次点打印时初始化,空闲时释放,能省下一块常驻内存。
- 大页面导出走异步回调,别在 UI 线程里等 PDF 数据回来再写盘,写文件丢给工作线程。
- 只需预览缩略图时用
mbUtilPrintToBitmap出位图,比导出整份 PDF 再截取快得多。
miniblink49 打印把弹窗、预览、枚举打印机、PDF/位图导出这些琐碎环节都收进了几个 API,应用侧真正要写的只有参数和落盘。打开仓库mbvip/printing/目录读一遍 Printing.h,再对着上面的三个场景动手,半小时内就能在你的应用里跑通第一条打印链路。
【免费下载链接】miniblink49a lighter, faster browser kernel of blink to integrate HTML UI in your app. 一个小巧、轻量的浏览器内核,用来取代wke和libcef项目地址: https://gitcode.com/GitHub_Trending/mi/miniblink49
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
