2017-08-26 15 views
1

私は既存のWebアプリケーション(HTML5、JS、CSSなど)をWindows UWPアプリケーションに変換しました。オフラインで実行できるように、Windowsストアからサーフェスハブに転送します。 PDF表示以外はすべて正常に動作しています。新しいウィンドウでPDFを開くと、Edgeベースのブラウザウィンドウがクラッシュするだけです。 IFRAMEを開いてPDFJSを読み込むと、それもクラッシュします。私が本当にやってみたいのは、PDFをオペレーティングシステムに渡して、ユーザーがインストールしたPDFビューアで見ることができるようにすることです。UWP(Universal Windows Platform)WebアプリケーションからPDFを起動する方法

私はいくつかのWindows固有のJavascript APIが有望であると思っていますが、動作させることができません。例:ファイル生成

Windows.System.Launcher.launchUriAsync(
    new Windows.Foundation.Uri(
    "file:///"+ 
    Windows.ApplicationModel.Package.current.installedLocation.path 
     .replace(/\//g,"/")+"/app/"+url)).then(function(success) { 
       if (!success) { 

:私はエッジにコピーすることができます// URLを、それはPDFを示したので、私は、URLのものが正しいと知っています。しかし、アプリケーションでは何もしません。

https:// URLをそのlaunchUriAsync関数に渡すと、それが機能します。だから関数はfile:// URLが好きではないようです。

また、私はこれを試してみました:

Windows.ApplicationModel.Package.current.installedLocation.getFileAsync(url).then(
    function(file) { Windows.System.Launcher.launchFileAsync(file) }) 

のいずれかに動作しなかったこと。再度、エラーはありません。それはただ何もしなかった。

私が試すことができる他のアイデアはありますか?

- アップデート -

回答を参照してください。ここで私が使用し終わったコードです。 (すべての私のファイルは、「アプリ」と呼ばれるサブフォルダにあることに注意してください):

if (location.href.match(/^ms-appx:/)) { 
     url = url.replace(/\?.+/, ""); 
     Windows.ApplicationModel.Package.current.installedLocation.getFileAsync(("app/" + url).replace(/\//g,"\\")).then(
      function (file) { 
       var fn = performance.now()+url.replace(/^.+\./, "."); 
       file.copyAsync(Windows.Storage.ApplicationData.current.temporaryFolder, 
        fn).then(
        function (file2) { 
         Windows.System.Launcher.launchFileAsync(file2) 
        }) 
      }); 
     return; 
    } 

はあなたが\に/を有効にする必要がありますか、ファイルを見つけることができませんが判明します。 copyAsyncは上書きを拒否しているので、私は常に新しいファイル名を使用するためにperformance.nowを使用します。 (私のアプリケーションでは、とにかくPDFのソースファイル名が自動生成されます)。ファイル名を保持したい場合は、それがすでに存在するかどうかをチェックするコードを追加する必要があります。

答えて

1

LaunchFileAsyncは、ここで使用する適切なAPIです。ファイルは保護されているため、インストールディレクトリから直接起動することはできません。まず、他のアプリ(PDFビューアなど)からアクセスできる場所にコピーする必要があります。 StorageFile.CopyAsyncを使用して、目的の場所にコピーを作成します。

公式SDKサンプル:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/AssociationLaunching

+0

このコメントは、C#サンプルが「インストールフォルダから直接ファイルを起動できないので、最初に一時フォルダにコピーしてください」と伝えています。私はjavascriptのWebアプリケーションでそのコピーを行う方法を把握できるかどうかを確認します。 –

+0

正解、インストール先からコピーする必要があります。そのためにStorageFile.CopyAsyncを使用できます。私はその詳細をキャプチャするために私の答えを編集します。 –

+0

私は最後に使用したコードを表示するために質問を更新します。 –

0

あなたは

https://github.com/Microsoft/Windows-universal-samples/blob/master/Samples/PdfDocument/js/js/scenario1-render.js

https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/PdfDocument/js

PDF APIを使用したいと思うでしょう、あなたは単純にPDFファイルをレンダリングしようとしていますか?

+0

理想的には、私は、ユーザーがインストールされているものは何でもPDFビューアで、それを起動したいと思います。それが私のElectronベースのアプリケーションでやっていることです。とてもうまく機能しています。彼らはPDFを手に入れたら、それを見たり、印刷したり、電子メールで送ったり、アプリケーションの外で保存することができます。私のモバイルアプリでも同じことが言えます。私はiOSのQuickLookに投げたり、Android上にあるPDFビューアに投げたりします。 ファイルを起動することが不可能な場合、PDFをレンダリングするためのコードが完全に書き込まれることがあります。しかし、なぜファイルを起動できないのでしょうか?それはナッツのようなものです。 –

関連する問題