Google 云打印 API - 打印 PDF 时出现白页
Google Cloud Print API - white page when printing PDF
我想发送要使用 Google 云打印 API 打印的 PDF 文件。下面的代码会给我一个积极的信息,告诉我已经生成了一页。当我去检查结果时,我打开了一个空白页面。
如果我将打印件保存在 Google 驱动器上,也会出现同样的结果。
代码
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
- Unirest v0.4.2
事实证明,Google 文档遗漏了一些关键信息。要发送二进制类型的数据,如 PDF,您需要将文件转换为 base64。除此之外,您需要告诉 Google 您将向他们发送一个带有添加字段 contentTransferEncoding
的 base64 blob,并将值设置为 base64
.
还有一件重要的事情。 Unirest
中有一个错误(至少对于 NodeJS),发送 base64 文件不会设置 Content-Size
header。甚至设置你自己的也不能解决问题。为了避免这个问题,我不得不切换到 Request。以下代码显示了 post 到 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);
});
我希望这对其他人有帮助:)
我想发送要使用 Google 云打印 API 打印的 PDF 文件。下面的代码会给我一个积极的信息,告诉我已经生成了一页。当我去检查结果时,我打开了一个空白页面。
如果我将打印件保存在 Google 驱动器上,也会出现同样的结果。
代码
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
- Unirest v0.4.2
事实证明,Google 文档遗漏了一些关键信息。要发送二进制类型的数据,如 PDF,您需要将文件转换为 base64。除此之外,您需要告诉 Google 您将向他们发送一个带有添加字段 contentTransferEncoding
的 base64 blob,并将值设置为 base64
.
还有一件重要的事情。 Unirest
中有一个错误(至少对于 NodeJS),发送 base64 文件不会设置 Content-Size
header。甚至设置你自己的也不能解决问题。为了避免这个问题,我不得不切换到 Request。以下代码显示了 post 到 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);
});
我希望这对其他人有帮助:)