Laravel中点击下载按钮无法生成并下载CoCard PDF文件求助
Laravel中CoCard PDF无法下载的代码问题排查
核心问题及缺失点:
- 未引入jsPDF库:代码中使用
new jspdf()生成PDF,但页面未加载jsPDF脚本,浏览器无法识别该构造函数,导致PDF生成逻辑完全无法执行。 - 异步函数执行顺序错误:
generateUrlQrCode是异步函数,但调用时未等待其完成就执行getCoCard,此时url变量可能还未赋值,会导致二维码图片添加失败,甚至中断整个流程。 - Blade语法使用错误:在Blade模板中使用原生PHP的
<?= ?>输出变量,应改用Blade的{{ }}(普通文本)或{!! !!}(用于HTML/URL等无需转义的内容),否则图片路径会被转义,无法正确加载。 - DOM元素获取时机过早:
getQRCode直接在脚本顶部调用,此时#qrcode元素可能还未渲染完成,会导致二维码生成失败。
修复后的coCard.blade.php代码示例:
<x-home-layout menu="CoCard" title="CoCard"> <div class="font-poppins lg:px-40 md:px-30 sm:px-16 px-3 lg:pt-32 md:pt-28 pt-24 mb-20"> <div class="grid justify-items-center"> <div class="text-base-blue-400 mb-5 text-center"> <h1 class="font-extrabold xl:text-4xl lg:text-3xl md:text-2xl sm:text-xl text-xl leading-normal"> Menyiapkan Co Card ... </h1> <p class="text-base mt-4 italic">Harap tunggu sebentar ...</p> <div id="qrcode" class="hidden"></div> </div> <div class="xl:w-45 lg:w-32 md:w-24 sm:w-20 w-16 h-2 bg-base-yellow-400"></div> </div> </div> @push('script-bottom') <!-- 补充引入jsPDF库 --> <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script> <script src="{{ asset('js/jquery-3.6.0.slim.min.js')}}" integrity="sha256-u7e5khyithlIdTpu22PHhENmPcRdFiHRjhAuHcs05RI=" crossorigin="anonymous"></script> <script src="{{ asset('js/qrcode.min.js') }}"></script> <script type="text/javascript"> // 等待DOM加载完成后生成二维码 document.addEventListener("DOMContentLoaded", function() { new QRCode(document.getElementById("qrcode"), { text: "{{ $username }}", }); // 二维码生成后再执行PDF生成流程 initCoCardGeneration(); }); let qrBlobUrl; async function generateQrBlobUrl() { const qrcodeImg = document.getElementById("qrcode").firstElementChild; const blob = await new Promise(resolve => qrcodeImg.toBlob(resolve)); qrBlobUrl = URL.createObjectURL(blob); } async function getCoCard() { // 确保二维码Blob URL已生成 await generateQrBlobUrl(); // jsPDF UMD版本需通过window.jspdf访问 const { jsPDF } = window.jspdf; const doc = new jsPDF('l', 'cm', 'a4', true); const width = 18; const height = 13; // 使用Blade语法输出图片路径 doc.addImage("{!! $imgDepan !!}", "PNG", 0, 0, width, height, '', 'FAST'); doc.addImage("{!! $desainDepan !!}", "PNG", 0, 0, width, height, '', 'FAST'); doc.addImage(qrBlobUrl, "PNG", 6.5, 4.33, 5, 5, '', 'FAST'); doc.addPage('l', 'cm', 'a4', true); doc.addImage("{!! $imgBelakang !!}", "PNG", 0, 0, width, height, '', 'FAST'); doc.addImage("{!! $desainBelakang !!}", "PNG", 0, 0, width, height, '', 'FAST'); doc.save("{{ $nimb }}_CoCard.pdf"); setTimeout(() => { window.close(); }, 1000); } async function initCoCardGeneration() { // 等待二维码生成并获取Blob URL后再生成PDF await getCoCard(); } </script> @endpush </x-home-layout>
内容的提问来源于stack exchange,提问作者imalia
相关产品推荐
相关产品推荐

