拓冰建站拓冰建站
首页 / 资讯中心 / 正文

miniblink49 网页打印与 PDF 导出指南:4 个接口打通预览、打印和落盘

miniblink49 网页打印与 PDF 导出指南4 个接口打通预览、打印和落盘【免费下载链接】miniblink49a lighter, faster browser kernel of blink to integrate HTML UI in your app. 一个小巧、轻量的浏览器内核用来取代wke和libcef项目地址: https://gitcode.com/GitHub_Trending/mi/miniblink49miniblink49 把 Blink 内核裁成可嵌入应用的轻量内核网页打印和 PDF 导出是它内置的能力你不需要在渲染层之外再拼一套打印方案。整条链路由 4 个 C 接口驱动设置默认打印值、直接打印、导出 PDF、静默打印参数都收敛在两个结构体里。下面的示例代码可以直接搬进你的工程编译。 先说结果一条页面能产出什么同一个 webView 上的同一个页面走不同接口会产出四种东西接口产出说明mbUtilPrintToPdf分页 PDF 数据通过mbPrintPdfDataCallback回调返回数据按页组织mbUtilPrint发往打印机的输出附带预览窗预览页是仓库里的PrintingPage.htmmbUtilsSilentPrint静默打印参数是一个 JSON 字符串不弹预览mbUtilPrintToBitmap页面位图用mbScreenshotSettings只有 width/height适合打印前的缩略图回调拿到的 PDF 数据结构很薄就三个成员typedef struct _mbPdfDatas { int count; // 页数 size_t* sizes; // 每页数据长度 const void** datas; // 每页数据指针 } mbPdfDatas;️ 最小示例把当前页面导出为 PDF调用侧只有 5 行先填mbPrintSettings再把回调挂上去mbPrintSettings s {}; s.dpi 600; s.isLandscape FALSE; mbUtilPrintToPdf(webView, wkeWebFrameGetMainFrame(webView), s, OnPdfReady, this);PDF 不是同步返回的落盘动作放在回调里做用datas里的指针和长度逐页写文件void OnPdfReady(mbWebView view, void* param, const mbPdfDatas* d) { // d-count 为页数第 i 页数据 d-datas[i]长度 d-sizes[i] // 在这里把每页数据拼成完整的 .pdf 写盘 }打印参数怎么配两个结构体一次性参数走mbPrintSettings每次mbUtilPrint/mbUtilPrintToPdf都带着它用户级的默认值走mbDefaultPrinterSettings用mbUtilSetDefaultPrinterSettings(webView, s)下发一次即可。两者的字段和默认值如下都在 mbvip/core/mb.h 里定义。mbPrintSettings字段作用structSize结构体大小先赋值再传别留 0dpi打印/导出分辨率width/height页面宽高marginTop/marginBottom/marginLeft/marginRight四边边距isPrintPageHeadAndFooter是否输出页眉页脚isPrintBackgroud是否输出背景色和背景图字段名就是仓库里这个拼写isLandscape横向打印isPrintToMultiPage多页输出mbDefaultPrinterSettings的构造器里写死了默认值不设置时就是这张表字段默认值说明isLandscapeFALSE纵向isPrintHeadFooterFALSE无页眉页脚isPrintBackgroudTRUE默认打印背景edgeDistanceLeft/Right0单位毫米edgeDistanceTop/Bottom10单位毫米copies1份数paperType9即DMPAPER_A4可换其他DMPAPER_*值只想改两三个默认值时mbDefaultPrinterSettings s; // 默认纵向、无页眉页脚、A4、上下边距 10mm s.isLandscape TRUE; // 改横向 s.copies 2; mbUtilSetDefaultPrinterSettings(webView, s);代码位置mbvip/printing/ 里各管什么打印相关实现集中在 mbvip/printing/。Printing.h里的printing::Printing类持有两个视图源视图m_mbSrcView和预览视图m_mbPreview枚举本地/网络打印机enumLocalPrinters、enumNetworkPrinters内部字段与参数一一对应——m_landscape、m_isPrintPageHeadAndFooter、m_isPrintBackgroud、m_userSelectPaperSize、m_userSelectPaperType、m_duplex。用户看到的设置界面不是原生对话框而是内嵌的 PrintingPage.htm 页面纸张、方向、边距都在那个页面里调。WkePrinting是 wke 一层的打印封装PdfViewerPlugin配合PdfiumLoadpdfium做 PDF 预览PdfDataVisitor负责按页取 PDF 数据getData(pageNum)/getDataSize(pageNum)对应的 C 接口是mbGetPdfPageData。几个容易踩的坑打印内容偏移、不居中部分打印机。现象同一份内容在别的机器上正常在目标打印机上偏位。原因仓库自己的注释写明——HP 等部分打印机如果不强制使用其默认纸型输出会不居中Printing.h里的m_nameToPrinterDefaultPaperType就是为此建的映射。解法给这类打印机强制指定对应的paperType而不是沿用通用默认值。背景色、背景图没打出来。现象页面上有底色的区块在打印输出里是白的。原因mbPrintBackgroud是BOOL自己手工填mbPrintSettings时漏设或置成了FALSE。解法确认该字段为TRUE默认打印值走mbDefaultPrinterSettings时它默认就是TRUE问题多半出在一次性参数这份结构体上。结构体没初始化就传参数不生效。现象改了dpi或边距输出毫无变化。原因mbPrintSettings和mbDefaultPrinterSettings都有structSize字段留 0 或整块未清零时行为不可预期。解法先整体清零或走默认构造再逐字段赋值。想在前端脚本里触发打印。现象页面 JS 里调用失败。原因内核的 browser functions 有白名单机制。好消息是window.native_print和window.native_printToPDF都在PdfViewerPluginFunc.cpp的白名单数组里前端直接调这两个名字即可无需额外注册。适用与不适用适合的场景Windows 桌面嵌入式应用里打印 HTML 报表、归档导出 PDF、给用户一个带预览窗的打印流程——这条链路是现成的从枚举打印机到DEVMODE输出doPrintImpl都封装好了。不太适合的场景非 Windows 平台打印落点走的是DEVMODE*这套 Windows 打印 API以及无头服务端批量渲染回调与具体的 webView/frame 绑定不是拿来当服务端渲染池用的。前端纯 JS 想自己拼 PDF 也不建议直接走mbUtilPrintToPdf的回调即可。下一步先把mbUtilPrintToPdf的回调跑通确认写出来的文件能被 PDF 阅读器打开、页数和d-count对得上。需要让用户调纸张和边距时接入mbUtilPrint预览界面就是PrintingPage.htm。前端要触发打印时直接调window.native_printToPDF参数组织方式参考mbPrintSettings的字段名。【免费下载链接】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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门