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

使用pdfMake.createPdf()能否基于现有Blob对象创建PDF?

结论

不可以直接在pdfMake的document definition中配置已有PDF类型的Blob对象,通过createPdf()方法完成PDF创建。


原因说明

你预期的实现逻辑代码如下:

const docDefinition = {
  content: [blob] // 直接传入PDF Blob的写法不被支持
}
pdfMake.createPdf(docDefinition);

pdfMake本身的设计就是从结构化的文档配置从零渲染生成PDF,它的content配置项只认框架预先约定好的结构化内容节点,原生支持的节点类型只有这几类:

  • 文本、段落、富文本块
  • 有序/无序列表
  • 表格
  • 图片(仅支持base64、合法地址指向的位图/矢量图资源,不支持PDF格式资源)
  • 矢量绘图元素
  • 分页符、页眉页脚、目录这类功能性节点

它从底层就没做解析、嵌入现有PDF Blob的能力,别说Blob,就算你传ArrayBuffer格式的PDF二进制数据进去它也识别不了。在TypeScript环境下你硬写的话,编译阶段就会报类型错误——pdfMake的官方类型定义里,content数组元素的联合类型根本没包含Blob类型;就算你用as any强行绕过TS校验,运行时生成的PDF里只会出现[object Blob]这类无意义的占位文本,根本不可能正确渲染原有PDF的内容。


可行替代方案

如果你需要把现有PDF内容和pdfMake生成的内容整合成一个完整PDF,可以选这两种实现路径:

  • PDF转图片嵌入
    先通过pdf.js这类工具把原有PDF Blob的每一页渲染成高分辨率图片,导出为base64格式后作为图片节点插到content数组里,再追加你需要用pdfMake生成的其他内容,最后调用createPdf()生成文件。这个方案实现起来简单,但缺点很明显:原有PDF里的文字会失去可选中、可复制的特性,清晰度会有损失,最终生成的文件体积也会大很多,只适合对PDF交互性、质量要求不高的场景。
  • 后置合并PDF(推荐)
    先正常用pdfMake生成你要自定义的那部分内容,拿到生成结果的Blob对象;再用专门的PDF操作库(比如pdf-lib),把原有PDF Blob和pdfMake刚生成的新PDF Blob做页面拼接、内容合并,最后导出完整的PDF文件。这个方案不会损失原有PDF的任何特性,文字可选中、清晰度不受影响,除了多引入一个依赖之外没有明显缺点,是生产环境的首选实现方式。

内容的提问来源于stack exchange,提问作者Łukasz Rzeszotarski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:36:28