Android开发通常会需要预览一个服务器中的PDF文件
使用原生WebView预览
项目地址
1.编写一个PDF预览界面,进入界面需要传一个PDF网络地址
界面内容
package org.venus.mpeqi.ui.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;
import org.venus.library.utils.ToastUtil;
import org.venus.mpeqi.R;
import org.venus.mpeqi.utils.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
* @Author Jxx 让世界看到我
* @Create 2022/4/21 9:47
* @Note TODO
*/
public class PDFActivity extends AppCompatActivity {
public static final String EXTRA_URL = "url";
private String url;
public static void join(Context context,String url){
Intent intent = new Intent(context, PDFActivity.class);
intent.putExtra(EXTRA_URL,url);
context.startActivity(intent);
}
@Bind(R.id.pdf_view)
WebView mPdfView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pdf);
ButterKnife.bind(this);;
initData();
}
private void initData() {
Intent intent = getIntent();
if (intent == null) {
ToastUtil.show(this, "数据错误");
finish();
return;
}
try {
url = intent.getStringExtra(EXTRA_URL);
if (url == null){
ToastUtil.show(this, "数据错误,请联系管理员");
finish();
return;
}
initView(url);
} catch (Exception e) {
e.printStackTrace();
ToastUtil.show(this, "数据错误,请联系管理员");
finish();
return;
}
}
private void initView(String url) {
mPdfView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
view.loadUrl(url);
return true;
}
});
WebSettings settings = mPdfView.getSettings();
settings.setSavePassword(false);
settings.setJavaScriptEnabled(true);
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);
settings.setBuiltInZoomControls(true);
mPdfView.setWebChromeClient(new WebChromeClient());
if (!"".equals(url)) {
byte[] bytes = null;
try {// 获取以字符编码为utf-8的字符
bytes = url.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if (bytes != null) {
url = new BASE64Encoder().encode(bytes);// BASE64转码
}
}
//下面是打开PDF的方法
mPdfView.loadUrl("file:///android_asset/pdfjs/web/viewer.html?file=" + url);
}
@Override
protected void onDestroy() {
super.onDestroy();
ButterKnife.unbind(this);
}
}
布局内容
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/pdf_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
2.将PDFJS文件拷贝到assets目录中
3.对网络路径转码还有2个工具类,相关文件可以在项目代码中自提。
4.在预览位置传入PDF网路地址打开预览界面
fileInfo.url就是PDF路径
FileListAdapter.OnItemEventListener mOnItemEventListener = new FileListAdapter.OnItemEventListener() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void click(FileInfo fileInfo) {
//ToastUtil.show(FileListActivity.this,fileInfo.url);
System.out.println("文件信息:"+new Gson().toJson(fileInfo));
//使用PDFJS预览
PDFActivity.join(FileListActivity.this,fileInfo.url);
}
};