WKHTMLTOPDF环境下旋转文本创建自定义div实现咨询
WKHTMLTOPDF 环境下Twig模板自定义Div实现方案
WKHTMLTOPDF 底层用的是老旧 QtWebKit 内核,只完整支持CSS2.1标准和极少部分CSS3属性,flex、grid、clip-path、大部分CSS渐变/阴影/圆角属性要么渲染错位要么直接不生效,按下面的思路做可以稳定出效果:
- 布局全用传统方案,别碰现代CSS布局属性
横向排版直接给块级元素加float: left,父元素加clearfix清浮动就行;垂直居中、等高布局直接用display: table搭配子元素display: table-cell; vertical-align: middle的表格布局方案,别浪费时间调flex、grid,这俩在WKHTMLTOPDF里的bug根本修不完。直接复用这个兼容所有老内核的clearfix代码就行:
.clearfix:after { content: ""; display: block; clear: both; height: 0; visibility: hidden; } - 视觉装饰别用CSS硬画,优先切图+绝对定位叠层
你要做的边角装饰、分层阴影、特殊边框这类效果,别尝试用border-radius、box-shadow、linear-gradient、clip-path写,这些属性在WKHTMLTOPDF里支持度极差,经常出锯齿、错位、直接消失的问题。直接把装饰元素切成小图,父元素设position: relative,装饰小图设position: absolute定到对应坐标就稳了;如果是重复的边框、底纹,切1px宽的切片做background-repeat平铺即可。
建议把装饰小图直接转成base64写进CSS,避免图片加载失败导致装饰缺失。 - 样式书写几个必注意的坑
- 所有长度单位优先用
px,别用rem、vw/vh,这类相对单位在PDF渲染时尺寸计算经常不准 - 所有CSS直接写在Twig模板内的
<style>标签里,别引用外部CSS文件,WKHTMLTOPDF经常出现外部资源加载超时、加载不全的问题 - 不想被分页截断的Div,统一加
page-break-inside: avoid; - 别靠JS动态插DOM,WKHTMLTOPDF默认不会等JS执行完就开始渲染,就算加延迟参数稳定性也很差,所有内容尽量靠Twig的模板逻辑静态输出
- 所有长度单位优先用
- 调试别偷懒
别在Chrome、Firefox里调完样式就直接生成PDF,现代浏览器内核和QtWebKit差得非常远,每写一部分就用WKHTMLTOPDF生成一次预览PDF确认效果,省得全写完才发现全不兼容返工。
可直接套用的Twig基础模板结构:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <style> * { margin: 0; padding: 0; box-sizing: border-box; } .target-div { position: relative; width: 700px; padding: 24px; margin: 20px auto; border: 1px solid #e5e5e5; background: #ffffff; } .corner-mark { position: absolute; top: 0; right: 0; width: 48px; height: 48px; /* 替换成自己的角标装饰base64 */ background: url("data:image/png;base64,") no-repeat; } .clearfix:after { content: ""; display: block; clear: both; height: 0; visibility: hidden; } </style> </head> <body> <div class="target-div"> <div class="corner-mark"></div> <!-- 在这里写自己的Twig渲染逻辑 --> 示例内容 </div> </body> </html>
内容的提问来源于stack exchange,提问作者Guillaume SOTTON
相关产品推荐
相关产品推荐

