3

我想使用 Google Cloud Print API 发送要打印的 PDF 文件。下面的代码会给我一个积极的消息,告诉我生成了一个页面。当我去检查结果时,我打开了一个空白页面。

如果我将打印件保存在 Google Drive 上,也会出现同样的结果。

编码

unirest.post('https://www.google.com/cloudprint/submit')
.header('Authorization', 'Bearer ' + token)
.header("Accept-Charset", "utf-8")
.field('xsrf', xsrf_token)
.field('printerid', printerId)
.field('ticket', '{"version": "1.0", "print": {}}')
.field('title', 'Test from Simpe.li')
.field('contentType', 'application/pdf')
.attach('content', buffer)
.end(function (res) {

    console.log(res);

});

我知道我发送的是 PDF,因为当我更改

.field('contentType', 'application/pdf')

.field('contentType', 'text/plain')

我将获得 53 页文本,这是 PDF 文件的原始内容。

在此处输入图像描述

问题

我做错了什么?

技术规格

  • NodeJS v4.1.1
  • 统一 v0.4.2
4

1 回答 1

6

事实证明,谷歌文档遗漏了一些关键信息。要发送二进制类型的数据,如 PDF,您需要将文件转换为 base64。除此之外,您需要告诉 Google 您将向他们发送一个带有 add 字段的 base64 blob 并将contentTransferEncoding值设置为base64.

另一个重要的事情。有一个错误Unirest(至少对于 NodeJS),发送 base64 文件不会设置Content-Size标题。甚至设置你自己的也不能解决问题。为了规避这个问题,我不得不切换到Request。以下代码显示了有效的 Google 云打印帖子:

let buffer64 = buffer.toString('base64');

let formData = {
    xsrf: xsrf_token,
    printerid: printerId,
    ticket: '{"version": "1.0"}',
    title: 'Test Print',
    contentTransferEncoding: 'base64',
    contentType: 'application/pdf',
    content: buffer64
};

let headersData = {
    'Authorization': 'Bearer ' + token
};

request.post({
    url: 'https://www.google.com/cloudprint/submit',
    headers: headersData,
    formData: formData
}, function (err, httpResponse, body) {

  if (err) {

    return console.error('upload failed:', err);

  }

  console.log('Upload successful!  Server responded with:', body);

});

我希望这对其他人有帮助:)

于 2016-02-25T14:51:08.223 回答