我已經將現有的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的源文件名是自動生成的。)如果你想保留文件名,你必須添加一堆代碼來檢查它是否已經存在,等等。
C#示例中的這條評論告訴:「無法直接從安裝文件夾啓動文件,因此先將其複製到臨時文件夾」。我會看看我是否可以弄清楚如何在javascript web應用程序中執行該複製。 –
正確,您需要從安裝位置複製。您可以使用StorageFile.CopyAsync。我將編輯我的答案來捕捉這些細節。 –
我將更新我的問題以顯示我最終使用的代碼。 –