在JavaScript或Node中将Blob数据转换为原始缓冲区

17

我正在使用一个插件jsPDF,它生成PDF并将其保存到本地文件系统。现在在jsPDF.js中,有一些代码会以blob格式生成pdf数据,如下:

var blob = new Blob([array], {type: "application/pdf"});

而且还将blob数据保存到本地文件系统。现在不再需要保存,我需要使用插件node-printer打印PDF。

这里是一些示例代码:

var fs = require('fs'),
var dataToPrinter;

fs.readFile('/home/ubuntu/test.pdf', function(err, data){
    dataToPrinter = data;
}

var printer = require("../lib");
printer.printDirect({
    data: dataToPrinter,
    printer:'Deskjet_3540',
    type: 'PDF',
    success: function(id) {
        console.log('printed with id ' + id);
    },
    error: function(err) {
        console.error('error on printing: ' + err);
    }
})

fs.readFile() 函数读取 PDF 文件并以原始缓冲区格式生成数据。

现在我想将 'Blob' 数据转换为 '原始缓冲区',以便打印 PDF。

4个回答

25

如果您没有使用NodeJS,则应该知道浏览器没有Buffer类实现,您可能会将代码编译到类似browserify的特定于浏览器的环境中。在这种情况下,您需要这个库将blob转换为Buffer类,该类应该尽可能地等同于NodeJS Buffer对象(实现在feross / buffer中)。

如果您正在使用node-fetch(不是OP的情况),则可能会从响应对象中获取blob:

const fetch = require("node-fetch");
const response = await fetch("http://www.stackoverflow.com/");
const blob = await response.blob();

这个blob是一个内部实现,仅存在于node-fetchfetch-blob库中,要将其转换为本地的NodeJS Buffer对象,您需要先将其转换为arrayBuffer:

const arrayBuffer = await blob.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);

然后可以将此缓冲区对象用于诸如文件写入和服务器响应之类的事物。


8

对我而言,以下内容解决了问题:

const buffer=Buffer.from(blob,'binary');

因此,可以使用 fs node 包将此缓冲区存储在 Google Cloud 存储和本地磁盘中。

我使用 blob 文件通过 ddp 协议(Meteor)从客户端向服务器发送数据,所以当此文件到达服务器时,我将其转换为缓冲区以便存储。


9
尝试了这个操作,结果收到了“TypeError [ERR_INVALID_ARG_TYPE]”错误提示:“第一个参数必须是字符串类型、Buffer实例、ArrayBuffer实例、数组或类数组对象中的一种。而你输入的是Blob实例。” - Terry Windwalker
3
@TerryWindwalker 请尝试使用 await blob.arrayBuffer().then((arrayBuffer) => Buffer.from(arrayBuffer, "binary")) - Noelle L.

3
           var blob = new Blob([array], {type: "application/pdf"});

            var arrayBuffer, uint8Array;
            var fileReader = new FileReader();
            fileReader.onload = function() {
                arrayBuffer = this.result;
                uint8Array  = new Uint8Array(arrayBuffer);

                var printer = require("./js/controller/lib");
                printer.printDirect({
                    data: uint8Array,
                    printer:'Deskjet_3540',
                    type: 'PDF',
                    success: function(id) {
                        console.log('printed with id ' + id);
                    },
                    error: function(err) {
                        console.error('error on printing: ' + err);
                    }
                })
            };
            fileReader.readAsArrayBuffer(blob);

这是最终可用的代码。打印机支持uint8Array编码格式。

-3

尝试:

var blob = new Blob([array], {type: "application/pdf"});
var buffer = new Buffer(blob, "binary");

它指定了输入字符串的编码。 - Alexandr Lazarev
你的意思是这里的“array”是“application/pdf”格式,而生成的“blob”是“binary”格式。 - Kamaldeep Singh
1
BLOB(二进制大对象)是存储在实体中的二进制数据集合。在您的特定情况下,此实体是一个字符串。如果您想从该字符串创建缓冲区,则应在缓冲区构造函数中指定其编码。这就是我的意思 :) - Alexandr Lazarev
让我们在聊天中继续这个讨论 - Kamaldeep Singh
20
这似乎在NodeJs上无法正常工作。我收到了一个错误:类型“Blob”的参数不能赋给类型“字符串”的参数。 - sixtyfootersdude
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接