PDFKit Не удается загрузить изображение в браузере

Я работаю с PDFKit, чтобы создать PDF-файл в браузере, а затем отправить большие двоичные данные этого PDF-файла на новую вкладку. для загрузки пользователем. Мне очень нравится PDFKit... он довольно приятный.

Однако я столкнулся с проблемой, когда пытаюсь использовать функцию PDFDocument.image() для "нарисовать" файл изображения:

Uncaught TypeError: fs.readFileSync не является функцией

Я довольно хорошо знаком с Node, поэтому сразу узнал сигнатуру этого метода — в браузере изначально нет fs! Я менее знаком с Browserify и вместо этого решил использовать готовую версию PDFKit для избегайте необходимости интегрировать другую зависимость, с которой я даже не знаком.

Мое единственное предположение состоит в том, что разработчики PDFKit не включили работающий запасной вариант для использования этой конкретной функции в браузере без Browserify — даст ли использование Browserify доступ к модулю fs (опять же, я никогда его не использовал)? Это мой единственный вариант здесь? Я пропустил определенный шаг, необходимый для работы этой функции?

В настоящее время я включаю следующие файлы JS в качестве зависимостей для моего файла generate_pdf.js:

  • pdfkit.js
  • blob-stream.js

Есть ли модуль, эмулирующий fs, который мне тоже нужен? Я не вижу этого в документах, но это был долгий день.


person Jordan Foreman    schedule 30.12.2015    source источник


Ответы (1)


Ну, есть несколько библиотек (например, эта или это), но я настоятельно рекомендую написать свой собственный fs.readFileSync.

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

Итак, вероятно самым простым и легким решением было бы добавить

var fs = {
  readFileSync: (path) => {
    // magic
  }
}

Почему вероятно? Хорошо...

  1. Если есть использование многих функций fs, вы, очевидно, захотите сделать это с помощью какой-то библиотеки.

  2. Синхронные запросы. Я предполагаю, что вы загружаете изображения с какого-то URL-адреса, поэтому вам придется использовать синхронные запросы в реализации fs.readFileSync для достижения желаемого результата. Это не так уж важно, но вы получите предупреждения в консоли.

P.S. извините, но есть высокая вероятность, что вы столкнетесь с большим количеством проблем с этим, потому что гораздо чаще создаются PDF-файлы на стороне сервера. Почему бы не перейти на бэкэнд? ;)

person Alexander Mikhalchenko    schedule 30.12.2015
comment
Спасибо за предложение! Я не уверен, почему PDFKit использует readFileSync для получения изображения с сервера (я не пытаюсь получить доступ к файловой системе клиента). Я не думаю, что буду накатывать свой собственный: p Причина, по которой я делаю это на клиенте, заключается в том, что мне гораздо удобнее работать с JavaScript, чем с PHP, и это для сайта WordPress. Я думаю, что я попытаюсь запустить простой сервер Node для создания PDF-файлов. - person Jordan Foreman; 31.12.2015
comment
Ну, вы можете просто сгенерировать pdf в процессе nodejs, вызванном из php, скажем, exec - нет необходимости настраивать сервер;) - person Alexander Mikhalchenko; 31.12.2015