Как конвертировать pdf из буфера, используя node-imagemagick - PullRequest
0 голосов
/ 09 апреля 2019

Я хочу преобразовать pdf-файл с помощью imagemagick из буфера, который я получаю по URL-адресу, содержащему pdf (не pdf-файл, поэтому мне не нужно сначала сохранять pdf и запускать imagemagick). Я использую node-imagemagick и в документации просто показываю метод convert () с путем к файлу, как показано ниже: (kittens.jpg)

im.convert(['kittens.jpg', '-resize', '25x120', 'kittens-small.jpg'], 
function(err, stdout){
  if (err) throw err;
  console.log('stdout:', stdout);
});

Но если я хочу использовать буфер, как я могу это сделать? Вот мой код

request.get({ url: 'url to pdf', encoding: null }, (err, resp, body) => {
  im.convert([body, '-resize', '25x120', 'kittens-small.jpg'], 
  function(err, stdout){
    if (err) throw err;
    console.log('stdout:', stdout);
  });
})

1 Ответ

1 голос
/ 10 апреля 2019

Вы можете проверить исходный код node-imagemagik: Ссылка на код .

node-imagemagik - это оболочка для инструмента convert.

Функция преобразования определяется следующим образом

exports.convert = function(args, timeout, callback) {
  var procopt = {encoding: 'binary'};
  if (typeof timeout === 'function') {
    callback = timeout;
    timeout = 0;
  } else if (typeof timeout !== 'number') {
    timeout = 0;
  }
  if (timeout && (timeout = parseInt(timeout)) > 0 && !isNaN(timeout))
    procopt.timeout = timeout;
  return exec2(exports.convert.path, args, procopt, callback);
}
exports.convert.path = 'convert';

Предполагается, что вы даете те же аргументы, что и в командной строке, то есть путь к исходному изображению. Тем не менее, convert поддерживает ввод из stdin, и именно так вы можете передать свои данные PDF в процесс.

В исходном коде есть полезный пример. Определение функции изменения размера, которая принимает двоичные данные и передает их в функцию преобразования с соответствующими параметрами.

var resizeCall = function(t, callback) {
  var proc = exports.convert(t.args, t.opt.timeout, callback);
  if (t.opt.srcPath.match(/-$/)) {
    if ('string' === typeof t.opt.srcData) {
      proc.stdin.setEncoding('binary');
      proc.stdin.write(t.opt.srcData, 'binary');
      proc.stdin.end();
    } else {
      proc.stdin.end(t.opt.srcData);
    }
  }
  return proc;
}

exports.resize = function(options, callback) {
  var t = exports.resizeArgs(options);
  return resizeCall(t, callback)
}

Вызов convert сделан с заменой имени входного файла на «-». Использование эквивалента из терминала будет выглядеть примерно так:

my_process_that_outputs_pdf | convert - <convertion options here...> my_output.png
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...