Android PDF未在浏览器和WebView中加载

我正在尝试在Android Webview中加载PDF文件。 当我用谷歌搜索它。 我find的最佳答案是使用Google文档。 现在,我所做的是在此url的末尾附加PDF文件urlhttps://docs.google.com/gview?embedded=true&url=

然后在android WebView中加载这个完整的URL。 它成功加载PDF。 但是,以下URL上有一个PDF文件未在WebView和Chrome浏览器(在我的系统上)中加载。 PDFurl是

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

然后它说没有预览可用。 任何人都可以告诉我这里错了什么。

Solutions Collecting From Web of "Android PDF未在浏览器和WebView中加载"

这不是一个完整的答案。 我研究了几种可能性,但对这种行为仍然没有令人信服的解释。

理论A:URL编码……没有

我的第一个想法与@ gn1相同 – 大括号需要URL编码 。 不幸的是,编码url参数不会改变结果。

理论B:糟糕的PDF文件……没有

接下来我想也许Google Docs无法处理这个特定的PDF文件 – 它是一个不受支持的版本或使用可选function,甚至还有其他观众容忍的错误。 我下载了一份副本并将其托管在另一个网站上。 当我将Google文档指向新位置时,它预览得很好。

理论C:不合作的地点……没有

接下来我想也许这个网站可能出于某种原因没有与Google Docs合作 – 也许它阻止谷歌将其编入索引。 我在相同的网站上find了另一个PDF链接,使用相同的方案:

http://www.expertagent.co.uk/asp/in4glestates/%7B6dad6f28-a59d-4b54-b277-52f077f4927f%7D/%7Be3a6d17c-d6a8-4e92-8f52-09c6721515fc%7D/External.pdf

当我将Google文档指向此链接时,它预览得很好。

理论D:不同的元数据……没有

现在我有一个有用的链接,有一个没有的链接。 也许他们的元数据是不同的 – 例如,工作的元数据标记为application / pdf而另一个则不是。 所以我查看了HTTP标头。

工作url:

 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 

不工作的url:

 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 

我发现元数据没有明显的显着差异。

理论E:来自Google的奇怪请求……没有

在这一点上,我当然正在抓住稻草。 我想知道谷歌的请求是否有所不同 – 可能它要求一个字节范围或模糊的压缩或其他东西,并且目标服务器不能很好地处理它。 因此,我将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) 

这根本不奇怪。 我确实validation了目标站点忽略了压缩请求,因此不会出现错误压缩的情况。 我也尝试使用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); } } 

在webview中查看打开PDF的示例代码,无需下载 。

 private void init() { WebView webview = (WebView) findViewById(R.id.webview); WebSettings settings = webview.getSettings(); settings.setJavaScriptEnabled(true); webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); PdfWebViewClient pdfWebViewClient = new PdfWebViewClient(this, webview); pdfWebViewClient.loadPdfUrl( "https://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwjgwIfp3KXSAhXrhFQKHQqEDHYQFggZMAA&url=http%3A%2F%2Fwww.orimi.com%2Fpdf-test.pdf&usg=AFQjCNERYYcSfMLS5ukBcT2Qy11YxEhXqw&cad=rja"); } private class PdfWebViewClient extends WebViewClient { private static final String TAG = "PdfWebViewClient"; private static final String PDF_EXTENSION = ".pdf"; private static final String PDF_VIEWER_URL = "http://docs.google.com/gview?embedded=true&url="; private Context mContext; private WebView mWebView; private ProgressDialog mProgressDialog; private boolean isLoadingPdfUrl; public PdfWebViewClient(Context context, WebView webView) { mContext = context; mWebView = webView; mWebView.setWebViewClient(this); } public void loadPdfUrl(String url) { mWebView.stopLoading(); if (!TextUtils.isEmpty(url)) { isLoadingPdfUrl = isPdfUrl(url); if (isLoadingPdfUrl) { mWebView.clearHistory(); } showProgressDialog(); } mWebView.loadUrl(url); } @SuppressWarnings("deprecation") @Override public boolean shouldOverrideUrlLoading(WebView webView, String url) { return shouldOverrideUrlLoading(url); } @SuppressWarnings("deprecation") @Override public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) { handleError(errorCode, description.toString(), failingUrl); } @TargetApi(Build.VERSION_CODES.N) @Override public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request) { final Uri uri = request.getUrl(); return shouldOverrideUrlLoading(webView, uri.toString()); } @TargetApi(Build.VERSION_CODES.N) @Override public void onReceivedError(final WebView webView, final WebResourceRequest request, final WebResourceError error) { final Uri uri = request.getUrl(); handleError(error.getErrorCode(), error.getDescription().toString(), uri.toString()); } @Override public void onPageFinished(final WebView view, final String url) { Log.i(TAG, "Finished loading. URL : " + url); dismissProgressDialog(); } private boolean shouldOverrideUrlLoading(final String url) { Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url); if (!isLoadingPdfUrl && isPdfUrl(url)) { mWebView.stopLoading(); final String pdfUrl = PDF_VIEWER_URL + url; new Handler().postDelayed(new Runnable() { @Override public void run() { loadPdfUrl(pdfUrl); } }, 300); return true; } return false; // Load url in the webView itself } private void handleError(final int errorCode, final String description, final String failingUrl) { Log.e(TAG, "Error : " + errorCode + ", " + description + " URL : " + failingUrl); } private void showProgressDialog() { dismissProgressDialog(); mProgressDialog = ProgressDialog.show(mContext, "", "Loading..."); } private void dismissProgressDialog() { if (mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); mProgressDialog = null; } } private boolean isPdfUrl(String url) { if (!TextUtils.isEmpty(url)) { url = url.trim(); int lastIndex = url.toLowerCase().lastIndexOf(PDF_EXTENSION); if (lastIndex != -1) { return url.substring(lastIndex).equalsIgnoreCase(PDF_EXTENSION); } } return false; } } 

根据事物的外观,您指向的URL包括一些特定于设备的位置引用。

您可以查看将文件下载到内部存储,然后使用意图在安装了任何应用程序的情况下加载PDF。

从如何通过SD卡从Intent打开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); 

或者,您可以使用Web URL实例化该文件

我把文件放在我的服务器上,它工作正常。 这是在url或robots.txt中遇到的Google文档问题。 该文件很好。 您可以使用url重写来让Google Docs误以为它来自其他文件夹。 路径中那些奇怪的角色可能就是问题所在。

Doc加载很好

从这里下载源代码( 在webview android中打开pdf );

activity_main.xml中

    

MainActivity.java

 package com.pdfwebview; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends AppCompatActivity { WebView webview; ProgressDialog pDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); listener(); } private void init() { webview = (WebView) findViewById(R.id.webview); webview.getSettings().setJavaScriptEnabled(true); pDialog = new ProgressDialog(MainActivity.this); pDialog.setTitle("PDF"); pDialog.setMessage("Loading..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); webview.loadUrl("https://drive.google.com/file/d/0B534aayZ5j7Yc3RhcnRlcl9maWxl/view"); } private void listener() { webview.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); pDialog.show(); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); pDialog.dismiss(); } }); } } 

这是“无预览可用”问题的工作解决方案。精确问题在于URL编码,我们将其与“ http://docs.google.com/gview?url= ”联系起来。 这意味着我们必须用unicode替换url的所有特殊字符(:,/,&etc)。 Uri.encode(“”)为我们做了诀窍。

 String url = Uri.encode("your link"); String finalUrl = "http://docs.google.com/viewer?url=" + url + "&embedded=true"; WebSettings webSettings = webView.getSettings(); webSettings.setBuiltInZoomControls(true); webSettings.setJavaScriptEnabled(true); webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setUseWideViewPort(true); webView.getSettings().setLoadWithOverviewMode(true); progressView.setVisibility(View.VISIBLE); webView.loadUrl(finalUrl); webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { view.getSettings().setLoadsImagesAutomatically(true); webView.setVisibility(View.VISIBLE); //progressView.setVisibility(View.VISIBLE); if (progressView != null && progressView.isShown()) { progressView.setVisibility(View.GONE); } Log.v("after load", view.getUrl()); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Toast.makeText(getApplicationContext(), description, Toast.LENGTH_SHORT).show(); Log.e("error", description); } });