2017-08-26 168 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可能是一个后备。但为什么要启动该文件是不可能的?这是坚果。 –

相关问题