Как извлечь локальные ссылки из PDF с помощью ngx-расширенного-pdf-просмотра

#angular #pdf #ngx-extended-pdf-viewer

Вопрос:

У нас есть приложение Angular, которое отображает PDF-файлы с сервера с помощью ngx-расширенного просмотра pdf. Некоторые pdf-файлы содержат внешние ссылки, указывающие на внешние сайты https://…, и поэтому они будут открыты в новой вкладке браузера. В приложении Angular также есть ссылки, указывающие на объекты. Эти ссылки используют внутренний идентификатор, такой как 12345.

При открытии pdf-файла с обычного рабочего стола Windows внутренние ссылки отображаются как «файл:///12345», но при открытии pdf-файла в приложении Angular с помощью ngx-extended-pdf-просмотра ссылки исчезают, и поэтому мы не можем получить их для перенаправления на внутреннюю страницу приложения.

Хорошо документированная витрина https://pdfviewer.net/extended-pdf-viewer/links описывает, что такого рода ссылки не поддерживаются.

Есть ли способ, которым я могу получать ссылки, не начинающиеся с https://… чтобы я мог перейти на внутреннюю страницу в нашем сценарии?

Ответ №1:

Обновленный ответ после правильного прочтения вопроса:

«Доступ к объекту в приложении Angular» может означать многое, но в основном каждый сценарий, о котором я могу думать, вращается вокруг вызова метода в компоненте или услуге Angular и уведомления об обнаружении изменений в Angular.

Во-первых, вам нужно добавить onclick обработчик, вызывающий ваш угловой метод. Вы можете сделать это, зарегистрировав (textLayerRendered) и используя его для изменения HTML-кода, который был отрисован pdf.js. Помимо прочего, он содержит для вас специальные file:// ссылки. Добавьте onclick обработчик, вызывающий ваш угловой метод.

Далее, у вас возникла проблема с тем, что вызывается ваш угловой метод, но вне контекста углового. Чтобы решить эту проблему, сделали NgZone инъекцию. Реализуйте код, который вы хотите запустить внутри Angular, вот так:

 public onCustomLinkClick(link): void {
  zone.run(() => {
     // put your custom code here
  });
}
 

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

Оригинальный ответ, описывающий, как получить доступ к традиционным file:// URL-адресам:

Я боюсь, что вы столкнулись с проблемой, которая не является ошибкой ngx-расширенного просмотра pdf. Это проблема браузерных приложений в целом. Если вы можете открыть файл на жестком диске вашего пользователя программно, вы, вероятно, сможете прочитать все их файлы. На самом деле, когда интернет был моложе, существовали лазейки, позволяющие читать произвольные локальные файлы.

Теперь представьте, что вы хакер, пытающийся украсть некоторые конфиденциальные данные. Написание браузерного приложения для чтения произвольных локальных файлов-это находка для вас! Вот почему каждый современный браузер прилагает все усилия, чтобы запретить такой доступ.

Есть одно исключение: если пользователь согласен, вы можете получить доступ к локальным файлам. Для этого пользователь должен использовать либо перетаскивание, либо диалоговое окно «открыть файл».

Короче говоря, пока вы пишете приложение, запущенное в браузере, вам не везет. Если вы пишете приложение с помощью Electron или Cordova, у меня для вас хорошие новости: в такой среде есть открытый билет для устранения ограничений (https://github.com/stephanrauh/ngx-extended-pdf-viewer/issues/938). Я даже придал ему высокий приоритет, так что функция, вероятно, скоро появится.

Комментарии:

1. Большое спасибо за ваш ответ. В моем сценарии речь идет не о чтении локальных файлов. Это похоже на то, что «внутренние» ссылки в PDF указывают на PDF-файлы или другой контент в приложении, используя идентификатор. Мне просто нужно иметь возможность прочитать идентификатор, чтобы я мог загрузить соответствующий контент. Я ценю любое предложение о том, как решить эту проблему.

2. О. Извините, что дал правильный ответ на вопрос, который вы не задавали. Я обновлю свой ответ.