WebView的createPrintDocumentAdapter()是Android上最可靠的HTML转PDF方案,需等待onPageFinished、设置viewport和UTF-8编码;iOS须用WKWebView+UIPrintPageRenderer+UIGraphicsPDFRenderer组合实现。

Android 上用 WebView 打印 HTML 生成 PDF 最可靠
安卓原生不提供直接的 html → pdf 转换 API,但 WebView 的 createPrintDocumentAdapter() 是目前最稳定、无需权限、不依赖网络的方案。它本质是调用系统打印服务,把网页“渲染成 PDF”,兼容 Android 4.4+,且能保留 CSS 样式和基础交互(如折叠/展开)。
常见错误现象:onWrite() 回调里输出空文件、PDF 里文字乱码、图片不显示、页面截断在第一屏。
- 必须等
WebView完全加载完成再调用打印——监听onPageFinished(),别用onPageStarted() - 确保 HTML 中有明确的
,否则移动端缩放错乱,PDF 排版崩溃 - 不要在
WebView外层套ScrollView或自定义缩放逻辑,会干扰打印布局计算 - 中文需在 HTML 中显式声明
,否则部分旧机型导出为方块
iOS 上 WKWebView + UIPrintPageRenderer 是唯一可行路径
iOS 没有公开的 HTML 渲染转 PDF 接口,WKWebView 本身不支持导出,必须走系统打印栈:用 UIPrintPageRenderer 配合 WKWebView 的 scrollView 内容截取,再用 UIGraphicsPDFRenderer 合成。过程绕但可控,不触发 App Store 审核风险。
使用场景:需要离线生成、带页眉页脚、分页控制(比如每章一页)。
立即学习“前端免费学习笔记(深入)”;
网新中英文企业手机电脑一体化建站专业版是专业为个人和企业网站建设而开发的一款智能化程序。该程序基于ASP+ACCESS环境开发,拥有完善的网站前台和后台全智能化管理功能,完全由后台操作(如添加、修改网站基本信息、产品、企业新闻动态等)静态生成前台界面HTML格式网页文件,是个人和企业智能化网站建设首选!
-
webView.scrollView.contentSize必须大于 0,否则渲染区域为空——务必等webView didFinishNavigation后再读取 - 不能直接对
webView截图,要通过render(in:)把内容画进 PDF context,否则高清屏下模糊或偏移 - 页边距、页眉高度必须手动算进
paperRect和printableRect,差 1pt 就可能丢内容 - CSS 中的
@page规则(如@page { size: A4; margin: 2cm; })在 iOS 上基本被忽略,别依赖
第三方库如 wkhtmltopdf 在手机上基本不可用
虽然 wkhtmltopdf 命令行在桌面端成熟,但在移动平台:Android 上需交叉编译 ARM 二进制并打包进 APK,体积暴增 10MB+,且常因 SELinux 策略被拒执行;iOS 更严格,App 不允许 dlopen 动态库或 fork 子进程,直接排除。
替代方案如 android-pdfview 或 PDFKit 只能显示 PDF,不能生成;jsPDF + html2canvas 在手机上性能极差,长页面内存溢出、缩放失真、CSS 支持残缺,仅适合单屏简单卡片。
- 看到 “支持移动端” 的 npm/cocoapods 库,先查它底层是否调用了系统 WebView 或 Print API——没调用的,基本是 demo 级
- 任何声称“一行代码转 PDF”的 SDK,大概率是上传 HTML 到它服务器处理,隐私和网络依赖无法回避
- Flutter 插件如
pdf或printing底层仍是调用原生 WebView 打印,只是封装了桥接,没绕过上述限制
生成 PDF 后的文件路径和权限容易被忽略
Android 输出路径必须是应用私有目录(如 getCacheDir())或通过 MediaStore 保存到相册,写入 /sdcard/ 直接失败(Android 10+ Scoped Storage);iOS 必须用 NSTemporaryDirectory() 或 Documents 目录,写入沙盒外路径会静默失败。
- Android 生成后记得调用
MediaScannerConnection.scanFile(),否则文件不会出现在系统文件管理器里 - iOS 上若用
UIDocumentInteractionController预览 PDF,路径必须是file://开头且文件存在,临时路径过期会导致预览空白 - PDF 文件名含中文时,Android 建议用
URLEncoder.encode(name, "UTF-8")编码,iOS 对 UTF-8 文件名支持良好,但避免/ \ : * ? " |
真正难的不是“怎么点一下生成”,而是让 PDF 在不同机型、不同系统版本、不同屏幕密度下都保持样式一致——这取决于你对 WebView 渲染边界和系统打印栈的理解深度,而不是选哪个库。










