【发布时间】:2018-02-04 14:42:06
【问题描述】:
我已将现有的 Web 应用程序(HTML5、JS、CSS 等)转换为 Windows UWP 应用程序,以便(希望)我可以通过 Windows 应用商店将其分发到 Surface Hub,以便它可以脱机运行。一切正常,除了 PDF 查看。如果我在新窗口中打开 PDF,基于 Edge 的浏览器窗口就会崩溃。如果我打开一个 IFRAME 并将 PDFJS 加载到其中,那也会崩溃。我真正想做的只是将 PDF 交给操作系统,这样用户就可以在他们安装的任何 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) {
这会生成一个 file:// URL,我可以将其复制到 Edge 中并显示 PDF,因此我知道 URL 内容是正确的。但是,在应用程序中它什么也不做。
如果我将 https:// URL 传递给该 launchUriAsync 函数,则可以。因此,该函数似乎不喜欢 file:// URL。
我也试过这个:
Windows.ApplicationModel.Package.current.installedLocation.getFileAsync(url).then(
function(file) { Windows.System.Launcher.launchFileAsync(file) })
那也没用。再次,没有错误。它只是没有做任何事情。
我可以尝试其他的任何想法吗?
-- 更新--
查看接受的答案。这是我最终使用的代码。 (请注意,我所有的文件都在一个名为“app”的子文件夹中):
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 的源文件名无论如何都是自动生成的。)如果你想保留文件名,你必须添加一堆代码来检查它是否已经存在,等等。
【问题讨论】:
标签: javascript windows pdf uwp