我已经将现有的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。我将编辑我的答案来捕捉这些细节。 –
我将更新我的问题以显示我最终使用的代码。 –