2017-08-26 167 views
1

我已經將現有的Web應用程序(HTML5,JS,CSS等)轉換爲Windows UWP應用程序,以便(希望)我可以分發它通過Windows商店到Surface Hubs,以便它可以脫機運行。一切工作正常,除了PDF查看。如果我在新窗口中打開PDF,基於Edge的瀏覽器窗口就會崩潰。如果我打開一個IFRAME並加載PDFJS,那也會崩潰。我真正想做的只是將PDF轉交給操作系統,以便用戶可以在他們安裝的任何PDF閱讀器中查看它。如何從UWP(通用Windows平臺)Web應用程序啓動PDF

我發現了一些看起來很有希望的特定於窗口的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,所以我知道該網址的東西是正確的。但是,在應用程序中它什麼都不做。

如果我將https:// URL傳遞給launchUriAsync函數,那可以。所以看來,函數只是不喜歡file:// URLs。

我也試過這樣:

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
+0

理想情況下,我想剛剛啓動它在用戶安裝任何PDF閱讀器。這就是我在基於Electron的應用程序中所做的,並且工作得很好。一旦他們擁有PDF,他們就可以查看,打印,發送電子郵件,並將其保存在應用程序之外的某個位置。在我的移動應用程序中同樣如此我只是把它放到iOS上的QuickLook上,或者將它扔到Android上的任何PDF閱讀器上。 如果不可能啓動文件,編寫一大堆代碼來渲染PDF可能是一個後備。但爲什麼要啓動該文件是不可能的?這是堅果。 –

相關問題