Google Cloud Print API - белая страница при печати PDF
Я хочу отправить файл PDF для печати с помощью Google Cloud Print API. Приведенный ниже код даст мне положительное сообщение о том, что была сгенерирована одна страница. Когда я иду и проверяю, что вышло, я открываю пустую страницу.
Тот же результат произойдет, если я сохраню распечатку на 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
1 ответ
Оказывается, в документации Google не хватает какой-то ключевой информации. Чтобы отправить данные двоичного типа, такие как PDF, вам необходимо преобразовать файл в base64. В дополнение к этому вы должны сообщить Google, что вы собираетесь отправить им блоб base64 с полем добавления. contentTransferEncoding
и установите значение в base64
,
Еще одна важная вещь. В баге есть ошибка Unirest
(по крайней мере для NodeJS), где отправка файла base64 не установит Content-Size
заголовок. Даже установка собственной не решит проблему. Чтобы обойти эту проблему, мне пришлось переключиться на запрос. Следующий код показывает сообщение в Google Cloud Print, которое работает:
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);
});
Я надеюсь, что это поможет другим:)