Как изменить поток из запроса в новый поток ответа в HummusJS

Мне нужно ввести PDF в PDF с помощью HummusJS.

В рабочей версии моего API я получу пост-запрос, содержащий base64, который я преобразую в поток двоичного читателя. (В приведенном ниже примере я использую тестовое чтение из локального файла.)

Вот мой тестовый поток ввода (который определен в фабрике объектов "создать"):

hummusReadStreamObject (filePath) {
  let fileData = fs.readFileSync(filePath).toString('hex');
  let result = []
  for (var i = 0; i < fileData.length; i+=2) {
    result.push('0x'+fileData[i]+''+fileData[i+1])
  }
  return new hummus.PDFRStreamForBuffer(result)
},

Я генерирую PNG (я подтвердил, PNG написан и действителен), а затем выполняю модификацию во время события "finally" потока

png.on('finish', function () {
    create.modifiedPDFResponseStream({
      pngFileName,
      readStream: create.hummusReadStreamObject('/foo/file/path'),
      res
    })
  })

modifiedPDFResponseStream теперь тянет в png и должен добавить его в файл:

modifiedPDFResponseStream ({ pngFileName, readStream, res }) {
  const writeStream = new hummus.PDFStreamForResponse(res)
  const pdfWriter = hummus.createWriterToModify(
    readStream,
    writeStream,
    { log: `path/to/error.txt` })
  debugger
  const pageModifier = new hummus.PDFPageModifier(pdfWriter,0);
  if (pngFileName) {
    const ctx = pageModifier.startContext().getContext()
    ctx.drawImage(2, 2, `./path/to/${pngFileName}`)
    pageModifier.endContext().writePage()
    pdfWriter.end()
  }
}

Я чувствую, что я близок к решению, журналы ошибок не сообщают о каких-либо проблемах, но я получаю следующее исключение при отладке через Chrome:

events.js:183 Uncaught Error: write after end
at write_ (_http_outgoing.js:622:15)
at ServerResponse.write (_http_outgoing.js:617:10)
at PDFStreamForResponse.write

проблема связана с тем, что поток заполняется во время.png .on('finish', ...) событие? Если да, есть ли синхронный подход, который я мог бы использовать, чтобы смягчить эту проблему?

1 ответ

Решение

Вдохновленный решением @JAM: " дождитесь окончания всех потоков - отправьте каталог с файлами"

Я решил эту проблему, имея .pngWriteStream Метод возвращает обещание и разрешает Writestream завершиться:

return new Promise((resolve, reject) => {
      try {
        writeStream.on('finish', resolve)
      } catch (e) {
        $.logger.error(e.message)
        reject()
      }

так что вместо:

const png = create.pngWriteStream({ ... })
png.on('finish', function () {
  create.modifiedPDFResponseStream({
    pngFileName,
    readStream: create.hummusReadStreamObject('/foo/file/path'),
    res
  })
})

Я жду разрешения обещания

const png = await create.pngWriteStream({
    fileName: pngFileName,
    value: '123456789' })

и файл img доступен для hummus.js для записи в PDF!

create.modifiedPDFResponseStream({
    pngFileName,
    readStream: create.hummusReadStreamObject('/foo/file/path'),
    writeStream: new hummus.PDFStreamForResponse(res)
  })
Другие вопросы по тегам