jsPDF html方法autoPaging的text模式导致文本样式错位/截断问题求助
jsPDF html方法autoPaging的text模式导致文本样式错位/截断问题求助
大家好,我最近在Vue3 + Laravel10的项目里用jsPDF的html方法生成PDF时遇到了个棘手的问题,想请教下有没有大佬能指点一二。
问题具体是这样的:我用autoPaging: 'text'模式来处理PDF分页,纯文本内容分页时一切正常,但只要元素带了样式(比如边框、背景色),跨页的时候文本会正确跳到下一页,可对应的样式却会被截断错位——比如我循环生成的h1元素,跨页的那一个,边框在分页边缘直接断了,完全没跟着文本续到下一页;换成背景色的话,同样背景色会在分页处截断,不会跟着文本延伸到下一页。
下面是我已经做的一些调整和项目背景,先跟大家说明下:
- 一开始用原生html2canvas时,项目里的颜色函数触发了oklch相关的错误,换成html2canvas-pro后这个问题解决了,所以现在全局挂载了这个库(因为jsPDF底层依赖html2canvas)
- 给jsPDF加了
px_scaling热修复,用来提升像素渲染的准确性,所以配置里加了这个选项 - PDF的基本配置是A4纵向,单位用px,设置了边距和宽度参数
以下是能复现问题的简化代码:
<script setup> import { Head } from '@inertiajs/vue3'; import { jsPDF } from "jspdf"; import { onMounted, ref } from 'vue'; import html2canvas from "html2canvas-pro"; window.html2canvas = html2canvas; function capture(){ const doc = new jsPDF({ orientation: 'p', unit: 'px', format: 'a4', hotfixes: ['px_scaling'], }); doc.html(document.getElementById('pdf-container'), { callback: function (doc) { doc.save(); }, margin: [60, 20, 60, 20], autoPaging: 'text', width: 754, windowWidth: 900, }); } </script> <template> <div id="pdf-container" class="pdf-container"> <h1 v-for="x in 50">This is a test h1 element.</h1> <button class="btn mt-8 btn-neutral" @click="capture()">Download PDF</button> </div> <!--end of pdf container--> </template> <style scoped> .pdf-container{ @apply w-full p-12 pt-4 bg-white; font-family:'Arial', sans-serif; letter-spacing: 0.01px; } h1{ @apply font-bold text-2xl border border-black; } </style>
生成的PDF里,跨页的h1元素文本会正常出现在下一页,但边框在分页边缘直接被截断,样式完全没跟上;如果把h1的样式换成背景色,也会出现同样的截断问题。
有没有朋友遇到过类似的情况,或者知道怎么让样式能跟着文本正确分页渲染呢?
内容来源于stack exchange
相关产品推荐
相关产品推荐

