我怎样才能显示一个PDF文档到Webview?

我想在webview上显示pdf内容。 这是我的代码:

WebView webview = new WebView(this); setContentView(webview); webview.getSettings().setJavaScriptEnabled(true); webview.loadUrl("devnet/acrobat/pdfs/pdf_open_parameters.html"); 

我得到一个空白的屏幕。 我也设置了互联网许可。

您可以使用Google文档查看器在线阅读您的PDF:

 WebView webview = (WebView) findViewById(R.id.webview); webview.getSettings().setJavaScriptEnabled(true); String pdf = "devnet/acrobat/pdfs/pdf_open_parameters.html"; webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf); 

如果您使用仅查看url的用户不被要求login到那里的谷歌帐户。

 https://docs.google.com/viewer?url=http://my.domain.com/yourPdfUrlHere.pdf 

您可以使用Mozilla pdf.js项目。 基本上它会显示你的PDF。 看看他们的例子 。

我只在浏览器(桌面和手机)上使用它,它工作正常。

这里用progressDialog加载。 否则需要给WebClient它强制在浏览器中打开:

 final ProgressDialog pDialog = new ProgressDialog(context); pDialog.setTitle(context.getString(R.string.app_name)); pDialog.setMessage("Loading..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); WebView webView = (WebView) rootView.findViewById(R.id.web_view); webView.getSettings().setJavaScriptEnabled(true); 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(); } }); String pdf = "devnet/acrobat/pdfs/pdf_open_parameters.html"; webView.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf); 

使用谷歌文档打开PDF在用户体验方面是一个坏主意。 这真的很慢,反应迟钝。

API 21以后的解决scheme自从API 21以来,我们有了PdfRenderer,它可以帮助将PDF转换成位图。

https://developer.android.com/reference/android/graphics/pdf/PdfRenderer.html

我从来没有用过,但似乎很容易。

针对任何api级别的解决scheme其他解决scheme是下载PDF并通过Intent将其传递给专用的PDF应用程序,该应用程序将执行一个展示它的恶作剧。 快速和良好的用户体验,特别是如果这个function不是在你的应用程序的核心。

使用此代码下载并打开PDF

 public class PdfOpenHelper { public static void openPdfFromUrl(final String pdfUrl, final Activity activity){ Observable.fromCallable(new Callable<File>() { @Override public File call() throws Exception { try{ URL url = new URL(pdfUrl); URLConnection connection = url.openConnection(); connection.connect(); // download the file InputStream input = new BufferedInputStream(connection.getInputStream()); File dir = new File(activity.getFilesDir(), "/shared_pdf"); dir.mkdir(); File file = new File(dir, "temp.pdf"); OutputStream output = new FileOutputStream(file); byte data[] = new byte[1024]; long total = 0; int count; while ((count = input.read(data)) != -1) { total += count; output.write(data, 0, count); } output.flush(); output.close(); input.close(); return file; } catch (IOException e) { e.printStackTrace(); } return null; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<File>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(File file) { String authority = activity.getApplicationContext().getPackageName() + ".fileprovider"; Uri uriToFile = FileProvider.getUriForFile(activity, authority, file); Intent shareIntent = new Intent(Intent.ACTION_VIEW); shareIntent.setDataAndType(uriToFile, "application/pdf"); shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); if (shareIntent.resolveActivity(activity.getPackageManager()) != null) { activity.startActivity(shareIntent); } } }); } 

}

要使Intent正常工作,您需要创build一个FileProvider来授予接收应用程序打开文件的权限。 https://developer.android.com/reference/android/support/v4/content/FileProvider.html

这是你如何实现它:在你的清单:

  <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> 

最后在资源pipe理器中创build一个file_paths.xml文件

 <?xml version="1.0" encoding="utf-8"?> <paths> <files-path name="shared_pdf" path="shared_pdf"/> </paths> 

希望这有助于=)

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

activity_main.xml中

 <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <WebView android:layout_width="match_parent" android:background="#ffffff" android:layout_height="match_parent" android:id="@+id/webview"></WebView> </RelativeLayout> 

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(); } }); } } 

谢谢!

这是谷歌允许您在获得评论中提到的错误之前实际使用限制 ,如果这是一生中一次的PDF,用户将在应用程序中打开,那么我感觉它是完全安全的。 尽pipebuild议遵循使用Android 5.0 / Lollipop中的内置框架的原生方法,但也称为PDFRenderer 。

这对我工作:

 webViewReportViewing.loadUrl("http://docs.google.com/gview?embedded=true&url=" +reportFileUrl);