Расшифровка Base64 PDF, дающая поврежденный файл - PullRequest
1 голос
/ 06 июня 2019

Может кто-нибудь объяснить, почему декодирование Base64 дает сломанный PDF? Мне нужно найти способ, как декодировать Base64 и получить PDF. Когда я пользуюсь этой услугой

https://emn178.github.io/online-tools/base64_decode_file.html

Я могу передать Base64 и получить файл без проблем.

Но когда я делаю то же самое в node.js, я получаю пустой (сломанный) файл последовательно. Я пробовал разные пакеты, такие как: JS-base64, atob

и ни один из них не сработал, получив в результате тот же пустой файл.

Ссылка на мой код: https://repl.it/@afiliptsov/FaroffGloriousFormula

Ответы [ 2 ]

3 голосов
/ 09 июня 2019

Вы получили поврежденный PDF, потому что:

  1. Согласно официальной документации 1005 *, Base64.decode() функция декодирует значение Base64 в строку UTF-8. Как Вы можете видеть, что это неправильная функция, потому что вам нужно декодировать значение в виде двоичных данных.
  2. Функция Base64.atob() делает именно то, что вам нужно, но вы сделать ошибку при сохранении данных, потому что, согласно Официальная документация , по умолчанию fs.writeFile() Функция сохраняет данные в формате UTF-8, а вы хотите сохранить двоичные данные.

Чтобы правильно декодировать значение Base64 и сохранить его в виде двоичных данных, в зависимости от ваших потребностей, вы можете выбрать один из следующих методов:

требуется ( 'JS-base64'). Base64.atob ()

Расшифруйте значение Base64 с помощью Base64.atob() и укажите двоичное кодирование при сохранении файла. Это полезно, только если вам нужно обрабатывать двоичные данные. В отличие от других методов, вы должны установить и загрузить модуль "js-base64".

var bin = Base64.atob(stringToDecode);
// Your code to handle binary data
fs.writeFile('result_binary.pdf', bin, 'binary', error => {
    if (error) {
        throw error;
    } else {
        console.log('binary saved!');
    }
});

Buffer.from

Преобразовать значение Base64 в буфер с помощью Buffer.from() и сохранить его в файл без указания кодировки. Это полезно, только если вам нужно обработать буфер.

var buf = Buffer.from(stringToDecode, 'base64');
// Your code to handle buffer
fs.writeFile('result_buffer.pdf', buf, error => {
    if (error) {
        throw error;
    } else {
        console.log('buffer saved!');
    }
});

Опция , кодировка , опция

Если вам не нужно считывать / изменять двоичные данные или буфер, просто укажите опцию кодирования при сохранении файла. Этот метод является самым простым и может быть самым быстрым и наиболее эффективным в использовании памяти.

fs.writeFile('result_base64.pdf', stringToDecode, 'base64', error => {
    if (error) {
        throw error;
    } else {
        console.log('base64 saved!');
    }
});
1 голос
/ 09 июня 2019

Простое - лучшее!Просто используйте пакет fs, чтобы сохранить строку base64 в файл, помните, что вы должны установить параметр base64 для encoding.

fs.writeFile('result_document.pdf', stringToDecode, 'base64', (error) => {
  if (error) throw error;
  console.log("Doc saved!");
});
...