You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Kendo中间插件生成PDF:传Base64至PHP得空白PDF问题

我之前也碰到过几乎一模一样的问题,大概率是Base64数据处理、前端传递或者PHP解码环节出了纰漏,给你梳理几个排查和解决的方向:

1. 先确认前端Kendo生成的PDF本身没问题

很多时候空白PDF的根源是Kendo生成的原始数据就有问题,先排除这个可能性:

  • 用Kendo自带的saveAs方法直接在前端下载PDF,看看文件是否正常:
kendo.drawing.drawDOM($("#your-content-element"))
  .then(function(group) {
    return kendo.drawing.exportPDF(group, { paperSize: "A4" });
  })
  .done(function(data) {
    // 直接在前端下载测试
    kendo.saveAs({
      dataURI: data,
      fileName: "test-frontend.pdf"
    });
  });

如果这个前端直接生成的PDF也是空白,那问题出在Kendo的渲染环节:比如目标元素隐藏、样式冲突(比如绝对定位元素未被正确捕获)、字体加载失败等,需要先调整Kendo的drawDOM配置或页面样式。

2. 修正前端Base64数据的传递格式

如果前端生成的PDF正常,那大概率是传递给PHP的Base64数据有问题:

  • 必须去掉Data URI前缀:Kendo返回的data是完整的data:application/pdf;base64,xxxxxx格式,后端解码时不需要前面的前缀,一定要剥离:
kendo.drawing.drawDOM($("#your-content-element"))
  .then(function(group) {
    return kendo.drawing.exportPDF(group, { paperSize: "A4" });
  })
  .done(function(data) {
    // 剥离前缀,只保留纯Base64字符串
    const pureBase64 = data.replace(/^data:application\/pdf;base64,/, "");
    // 发起POST请求
    $.ajax({
      url: "generate-pdf.php",
      type: "POST",
      data: { pdfData: pureBase64 },
      success: function(res) {
        // 处理后端返回的下载响应
        const blob = new Blob([res], { type: "application/pdf" });
        const url = URL.createObjectURL(blob);
        const a = document.createElement("a");
        a.href = url;
        a.download = "generated.pdf";
        a.click();
        URL.revokeObjectURL(url);
      },
      error: function(xhr) {
        console.error("请求失败:", xhr.responseText);
      }
    });
  });
  • 检查POST数据长度:如果PDF内容较大,要确保PHP配置允许足够大的POST请求,修改php.ini中的参数:
post_max_size = 64M
upload_max_filesize = 64M
memory_limit = 128M
3. 修复PHP端的Base64解码与输出逻辑

后端的解码和输出错误是导致空白PDF的常见原因,参考以下正确实现:

<?php
// 确保字符编码统一
header('Content-Type: application/pdf; charset=utf-8');

if (!isset($_POST['pdfData'])) {
    die("未接收到PDF数据");
}

$base64Str = $_POST['pdfData'];
// 处理URL安全的Base64(如果前端传递的是替换了+/-的格式)
$base64Str = str_replace(['-', '_'], ['+', '/'], $base64Str);

// 解码Base64
$pdfContent = base64_decode($base64Str);
if ($pdfContent === false) {
    die("Base64解码失败,请检查数据完整性");
}

// 输出PDF供下载
header('Content-Disposition: attachment; filename="final.pdf"');
header('Content-Length: ' . strlen($pdfContent));
echo $pdfContent;
exit;
?>

注意:如果要将PDF保存到服务器而非直接下载,要确保目标目录有写入权限,比如:

$savePath = './saved-pdfs/final.pdf';
// 确保目录存在
if (!is_dir(dirname($savePath))) {
    mkdir(dirname($savePath), 0755, true);
}
if (file_put_contents($savePath, $pdfContent)) {
    echo "PDF已保存到服务器";
} else {
    die("无法写入PDF文件,请检查目录权限");
}
4. 额外排查点
  • 检查浏览器Network面板:查看POST请求的Form Data,确认pdfData参数是完整的纯Base64字符串,没有被截断或转义;
  • 测试Base64解码:把前端传递的Base64字符串复制到在线Base64解码工具,看看是否能还原出正常的PDF内容,以此区分是前端传递问题还是后端解码问题。

你可以按照这个顺序一步步排查,先锁定问题出在前端生成、数据传递还是后端处理,应该能快速解决空白PDF的问题。

内容的提问来源于stack exchange,提问作者Nitin Bhat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:35:54