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);

});

Я надеюсь, что это поможет другим:)

Другие вопросы по тегам