Как запустить PDF-файл из упакованного приложения Chrome?

Мое упакованное приложение Chrome содержит PDF-файл, и я хотел бы, чтобы пользователь мог его просмотреть. Если я открою его в текущем кадре, я получаю сообщение об ошибке «Chrome PDF Viewer не разрешен».

Честно говоря, хромированная программа просмотра PDF довольно ужасна, поэтому я бы предпочел, чтобы пользователь все равно просматривал ее в своей любимой программе просмотра PDF. Если я отключу плагин chrome PDF (просто в качестве эксперимента) и попытаюсь открыть PDF-файл с помощью chrome.app.window.open, он «загрузит» PDF-файл, а затем пользователь сможет его открыть. Но у этого есть две проблемы:

  1. Я не могу реально заставить пользователя перейти на chrome://plugins и отключить его
  2. Нет окна браузера, поэтому пользователь не знает, что загрузка произошла

Какие-либо предложения? Открытие PDF-файлов, встроенных в мое приложение, является обязательной функцией для этого приложения.


person Joshua Smith    schedule 26.09.2013    source источник
comment
К сожалению, я перепробовал все, что мог придумать, но безрезультатно (даже пробовал dataURL). Похоже, приложения Chrome официально ненавидят PDF-файлы. Единственным решением для меня было разместить файл на сервере и просто открыть окно браузера, указывающее на этот файл (ничего не размещено локально), то есть window.open("http://my.domain.com/path/to/sample.pdf");.   -  person gkalpak    schedule 26.11.2013
comment
Спасибо за попытку! Я, вероятно, могу использовать это как обходной путь, пока Chrome не соберется вместе. Возможно, я назову это функцией, так как это означает, что большие толстые PDF-файлы не должны будут отягощать приложение.   -  person Joshua Smith    schedule 26.11.2013


Ответы (2)


Я внимательно изучил это и пришел к выводу, что нет способа заставить приложение Chrome открывать локальный PDF-файл. Я тоже пробовал URI данных.

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

Что касается меня, я создаю PDF в своем приложении Chrome. Поскольку я не могу его отобразить и нет сервера для его загрузки, я записываю его в файл по выбору пользователя и предоставляю пользователю самому разобраться с этим.

person Marc Rochkind    schedule 06.12.2013
comment
Интересно... спасибо за подсказку. Тем не менее, похоже, что мне придется сильно потрудиться над кодом, чтобы встроить его в приложение Chrome. Похоже, он настроен для расширения Chrome. Однако есть на что посмотреть. - person Marc Rochkind; 07.12.2013
comment
Я предполагаю, что это ограничение является преднамеренным прямо сейчас. Они гиперпараноидально относятся к тому, что приложения становятся вектором атаки, и они просто не доверяют своему собственному коду рендеринга PDF настолько, чтобы включить его прямо сейчас. Я подозреваю, что если бы был способ открыть новое окно с изолированной программной средой безопасности вокруг него, это решило бы проблему. - person Joshua Smith; 07.12.2013
comment
jesmith: См. комментарий от ExpertSystem выше. Нет проблем с доступом к PDF на веб-сайте. Чего вы, по-видимому, не можете сделать в приложении Chrome, так это открыть PDF-файл, который хранится локально. Итак, я не думаю, что это проблема безопасности PDF, а скорее другая проблема безопасности, связанная с локальными ресурсами, которая влияет на возможность просмотра локальных PDF-файлов. - person Marc Rochkind; 07.12.2013

У меня это работает, но будет ли это решением для вас, во многом зависит от вашего варианта использования. Решение состоит из трех частей:

  1. Используйте pdfjs для фактического рендеринга.

Чтобы заставить это работать в упакованном приложении, вам нужно немного поработать над поддержкой интернационализации. И даже после этого вы обнаружите, что некоторые PDF-файлы отказываются загружаться без видимой причины. Так что не пытайтесь заставить pdfjs работать в упакованном приложении. Просто:

  1. Поместите все свое приложение в <webview> с сохраняемым разделом и используйте манифест кеша HTML5, чтобы сделать все ваши файлы доступными для просмотра в автономном режиме.

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

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

Вы также получите преимущество, заключающееся в том, что вам не нужно переписывать свое приложение, чтобы оно соответствовало драконовским правилам упакованных приложений (eval, sync xhr, ограничение в 2 ГБ и т. д.).

Вы можете увидеть рабочий пример на m.kaon.com/c/ka (посетите Chrome, чтобы получить настольное приложение; если вы посетите его с Firefox, вы получите доступ к размещенному приложению, которое использует те же приемы). PDF-файлы находятся в нижней части раздела «Почему стоит выбрать Kaon».

person Joshua Smith    schedule 02.03.2015