无法在Android的inappbrowser中启动PDF文件

11

当用户点击链接时,我有一个要求在inappbrowser中显示pdf。 在ios中工作正常但在android上无法正常工作。 我正在使用IBM Worklight进行我的项目。 下面是我使用的代码:

window.open("pdfURL","_blank","location=yes");
在iOS中,inappbrowser会启动并显示PDF文件,但在Android中,inappbrowser会启动但不会显示任何内容。

你能分享一下日志/错误吗? - Karikalan
我没有收到任何错误信息。Inappbrowser正在启动URL,但是它无法从该链接显示/下载PDF文件。 - user3878988
6个回答

26

与iOS不同,其内置了PDF阅读器 - Android的Webview没有内置的PDF阅读器。
这就是为什么它在Android上无法使用的原因。

在Android中你有两个选择:

  1. 使用Google Docs查看文件,将文件存储在远程服务器上,并通过重定向用户来执行以下操作:window.open(encodeURI('https://docs.google.com/gview?embedded=true&url=http://www.your-server.com/files/your_file.pdf'), '_blank', 'location=yes,EnableViewPortScale=yes');

  2. 或者使用Cordova插件。例如这个插件(你可以在Google中搜索更多)。对于此操作,您需要学习如何在Worklight中创建Cordova插件

您可以在此处阅读更多选项:Phonegap InAppBrowser 显示pdf 2.7.0


谢谢你的回答。我尝试了第一种选项,但是当我使用这段代码时,在inappbrowser中看到的是HTML内容/代码,而不是PDF文件。如果我需要进行其他代码更改才能使第一种选项起作用,请告诉我。谢谢。 - user3878988
我已经亲自尝试过使用以下代码进行测试:window.open(encodeURI('https://docs.google.com/gview?embedded=true&url=http://kmmc.in/wp-content/uploads/2014/01/lesson2.pdf'), '_blank', 'location=yes,EnableViewPortScale=yes');,并且它可以正常工作。请确保将PDF文件存储在公共文件服务器中(而不是Worklight服务器)。 - Idan Adar
当我尝试替换我的PDF URL时,会丢失会话cookie,导致显示会话超时页面JSP代码SRC。为了有一个解决方法,我想像在Android浏览器中那样下载PDF。当我在Android浏览器中运行我的应用并点击PDF链接时,它会打开新标签页并下载PDF。是否可以使用PhoneGap/Worklight从Android WebView中执行相同的操作?谢谢。 - user3878988
Google Docs 阅读器不支持在 Android 设备上打开链接。 - Elia Weiss
如果我们不需要头文件,那么'https://docs.google.com/gview?embedded=true&url=http://www.your-server.com/files/your_file.pdf这个链接可以使用。如果我们需要添加头文件,可以使用file-transfer插件将pdf文件保存到本地,然后将路径与url路径拼接起来。但是出现了错误,找不到该文件。有没有其他方法可以在inappbrowser中显示本地pdf文件?@IdanAdar - Mohan Gopi
@EliaWeiss 有没有办法从附加到Google文档查看器的Android中打开文件路径。 - Mohan Gopi

6

尝试使用

window.open('pdfURL',"_system","location=yes,enableViewportScale=yes,hidden=no");

在使用_system时,将下载文件并在系统的应用程序中打开,例如Chrome或其他PDF查看器。


1
你尝试过在Android上使用“_system”解决方案来验证PDF是否可行吗? - Brant
这对我解决了问题。虽然我认为可能会滥用此设置,但在我的开发/调试应用程序中似乎可以工作,并且在部署签名的APK时会报告任何不同之处。 - billy_comic

5

使用 uriEncodeComponent(link) 和 https://docs.google.com/viewer?url= link

支持 Doc、Excel、Powerpoint 和 pdf 格式。

使用 Cordova 内置浏览器。

document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
    window.open = cordova.InAppBrowser.open;
        }

            $("body").on("click",function(e){
           var clicked = $(e.target);
         if(clicked.is('a, a *'))
       {
             clicked = clicked.closest("a");
             var link = clicked.attr("href");
            if(link.indexOf("https://") !== -1)
           {
               if(true) //use to be able to determine browser from app
                 {
                    link = "http://docs.google.com/viewer?url=" +  encodeURIComponent(link) + "&embedded=true";
             }

                 window.open(link, "_blank", "location=no,toolbar=no,hardwareback=yes");
                return false;
            }
    }
    });

请注意,如果意图是从设备存储中打开PDF,则此解决方案将无法正常工作-它将导致空白屏幕且没有控制台错误。使用设备的浏览器可能会按预期工作。 - JurgenBlitz
1
我不相信你会使用inappbrowser来显示已经存在于设备上的PDF文件?我认为这没有多大意义。 - Marc Magon
这不是通常的做法,但我目前正在处理的项目采用这种方式来克服一些 PDF 库(如 ng2-pdf-viewer)可能带来的缩放和纵横比限制。在 iOS 上运行良好,但在 Android 上则不然。 - JurgenBlitz

1
使用Google Drive Viewer似乎是一个不错的快速选项。但是,未来他们可能会更改或淘汰他们的API,您将不得不找到新的支持方式。此外,安全性也是另一个考虑因素,因为您的文件是公开可用和可下载的。
我在最近的项目中遇到了类似的情况,我们通过使用:pdf.js来解决它。
这是一个基于JS的PDF解析器,具有良好的阅读功能集。它不像本机应用程序那样流畅,但对我们来说已经足够了。其主要优点是我们控制代码,并能够从设备文件系统打开文件。
如果您想选择更本地的应用程序路线,那么如@Idan Adar所提到的,使用本地库+cordova插件是正确的方法。

0

尝试这段代码,对我来说运行良好。

var inAppBrowserRef;
var target = "_system";
var options = "location=yes,hidden=no,enableViewportScale=yes,toolbar=no,hardwareback=yes";
inAppBrowserRef = cordova.InAppBrowser.open(url, target, options); 

这对我来说导致了InAppBrowser: Error loading url file:///android_asset/www/assets/pdf/my.pdf:android.os.FileUriExposedException: file:///android_asset/www/assets/pdf/my.pdf exposed beyond app through Intent.getData(),主要是因为API Level 24+中加强的安全措施(请参见https://dev59.com/zVoT5IYBdhLWcg3wvRpk#38858040)。 - timbru31
InAppBrowser:加载URL时出错:这是您要打开的PDF URL。请使用以下更新的代码: code var url ="www.abc.com/abc/xyz.pdf"; var inAppBrowserRef; var target = "_system"; var options = "location=yes,hidden=no,enableViewportScale=yes,toolbar=no,hardwareback=yes"; inAppBrowserRef = cordova.InAppBrowser.open(url, target, options); - Pankaj Singh Sugara
1
感谢更新,但我们的PDF文件与应用程序捆绑在一起,没有外部网站可以链接。通过遵循这个解决方法来解决问题:https://github.com/pwlin/cordova-plugin-file-opener2/issues/28#issuecomment-218442994 - timbru31

0

这对我而言正常运作。

window.open(link, "_blank","location=yes");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接