Abd*_*sin 27 pdf android webview
我正在尝试在Android Webview中加载PDF文件.当我用谷歌搜索它.我找到的最佳答案是使用Google文档.现在,我所做的是在此网址的末尾附加PDF文件网址 https://docs.google.com/gview?embedded=true&url=
然后在android WebView中加载这个完整的URL.它成功加载PDF.但是在以下URL上有一个PDF文件未在WebView和Chrome浏览器(在我的系统上)中加载.PDF网址是
http://www.expertagent.co.uk/asp/in4glestates/ {16D968D6-198E-4E33-88F4-8A85731CE605}/{05c36123-4df0-4d7d-811c-8b6686fdd526} /external.pdf
当我尝试将PDF加载为 https://docs.google.com/gview?embedded=true&url=www.expertagent.co.uk/asp/in4glestates/ {16D968D6-198E-4E33-88F4-8A85731CE605}/{ 05c36123-4df0-4d7d-811C-8b6686fdd526} /external.pdf
然后它说没有预览可用.任何人都可以告诉我这里错了什么.
rha*_*oto 10
这不是一个完整的答案.我研究了几种可能性,但对这种行为仍然没有令人信服的解释.
我的第一个想法与@ gn1相同 - 大括号需要URL编码.不幸的是,编码url
参数不会改变结果.
接下来我认为Google Docs可能无法处理这个特定的PDF文件 - 它是一个不受支持的版本或使用可选功能,甚至还有其他观众容忍的错误.我下载了一份副本并将其托管在另一个网站上.当我将Google文档指向新位置时,它预览得很好.
接下来我想也许这个网站可能出于某种原因没有与Google Docs合作 - 也许它阻止谷歌索引它.我在相同的网站上找到了另一个PDF链接,使用相同的方案:
当我将Google文档指向此链接时,它预览得很好.
现在我有一个工作链接,一个没有.也许他们的元数据是不同的 - 例如,工作的元数据标记为application/pdf而另一个则不是.所以我查看了HTTP标头.
工作网址:
HTTP/1.1 200 OK
Cache-Control: max-age=3600
Content-Length: 1767120
Content-Type: application/pdf
Last-Modified: Fri, 02 Nov 2007 12:45:00 GMT
Accept-Ranges: bytes
ETag: "46b1592e4e1dc81:13e6"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Wed, 03 Jun 2015 23:25:23 GMT
Run Code Online (Sandbox Code Playgroud)
不工作的网址:
HTTP/1.1 200 OK
Cache-Control: max-age=3600
Content-Length: 4623702
Content-Type: application/pdf
Last-Modified: Mon, 11 May 2015 15:53:16 GMT
Accept-Ranges: bytes
ETag: "acac5d9828cd01:13e6"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Wed, 03 Jun 2015 23:25:42 GMT
Run Code Online (Sandbox Code Playgroud)
我发现元数据没有明显的显着差异.
在这一点上,我当然正在抓住稻草.我想知道来自谷歌的请求是否有所不同 - 可能是它要求字节范围或模糊压缩等等,目标服务器并不能很好地处理它.因此,我将Google Docs指向我控制的网站,以查看HTTP请求的外观:
GET /asp/in4glestates/%7B16D968D6-198E-4E33-88F4-8A85731CE605%7D/%7B05c36123-4df0-4d7d-811c-8b6686fdd526%7D/External.pdf HTTP/1.1
Host: www.example.com:55555
Connection: Keep-alive
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/5.0 (compatible; Google AppsViewer; http://drive.google.com)
Run Code Online (Sandbox Code Playgroud)
这根本不奇怪.我确实验证了目标站点忽略了压缩请求,所以它不是一个错误压缩的情况.我也尝试使用User-Agent标头访问目标站点,这似乎并不重要.
所以我找到了有助于告诉我们什么不是问题的线索,但没有解释什么是什么.我希望这些负面结果对某人有用.
我正在使用它并为我工作:http://weimenglee.blogspot.com/2013/05/android-tip-displaying-pdf-document.html
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView webView=new WebView(MainActivity.this);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setPluginState(WebSettings.PluginState.ON);
//---you need this to prevent the webview from
// launching another browser when a url
// redirection occurs---
webView.setWebViewClient(new Callback());
String pdfURL = "http://www.expertagent.co.uk/asp/in4glestates/{16D968D6-198E-4E33-88F4-8A85731CE605}/{05c36123-4df0-4d7d-811c-8b6686fdd526}/external.pdf";
webView.loadUrl(
"http://docs.google.com/gview?embedded=true&url=" + pdfURL);
setContentView(webView);
}
private class Callback extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(
WebView view, String url) {
return(false);
}
}
Run Code Online (Sandbox Code Playgroud)
Oli*_*ted -1
从表面上看,您指向的 URL 包含一些特定于设备的位置引用。
您可以考虑将文件下载到内部存储,然后使用意图在安装的任何应用程序中加载 PDF。
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/example.pdf");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用 Web url 实例化该文件