Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách hiển thị PDF trong WebView Android

Giới thiệu

Hướng dẫn này trình bày cách hiển thị file PDF trong Android WebView. Vì WebView gốc không hỗ trợ render PDF trực tiếp, phương pháp phổ biến nhất là sử dụng Google Docs Viewer để nhúng PDF.

Các bước thực hiện

Bước 1: Tạo dự án mới

Tạo dự án Android Studio: File → New Project.

Bước 2: Layout activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

Bước 3: MainActivity.java

package com.example.myapplication;

import android.os.Build;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.app.ProgressDialog;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Đang tải PDF...");
        progressDialog.setCancelable(false);

        WebView webView = findViewById(R.id.web_view);
        webView.requestFocus();
        
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setBuiltInZoomControls(true);
        webSettings.setDisplayZoomControls(false);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setUseWideViewPort(true);

        // URL PDF cần hiển thị (phải accessible công khai)
        String pdfUrl = "https://gymnasium-wandlitz.de/vplan/vplan.pdf";
        
        // Sử dụng Google Docs Viewer để nhúng PDF
        // Format: https://docs.google.com/viewer?embedded=true&url={PDF_URL_ENCODED}
        String viewerUrl = "https://docs.google.com/viewer?embedded=true&url=" + 
                           android.net.Uri.encode(pdfUrl);

        webView.loadUrl(viewerUrl);

        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }

            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                progressDialog.dismiss();
                view.loadUrl("about:blank");
            }
        });

        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress < 100) {
                    progressDialog.show();
                }
                if (newProgress == 100) {
                    progressDialog.dismiss();
                }
            }
        });
    }
}

Bước 4: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                

Các phương pháp hiển thị PDF trên Android

Phương phápƯu điểmNhược điểmPhù hợp
Google Docs Viewer (WebView)Đơn giản, không cần lib, cross-platformCần Internet, PDF phải public, giới hạn kích thước (~25MB)PDF online nhỏ, prototype nhanh
PDFViewager / pdfviewer-androidOffline, render native, mượt, tùy biến caoCần thêm thư viện, tăng size APKApp đọc PDF chính thức
Android PdfRenderer (API 21+)Built-in, không cần lib bên 3Chỉ render bitmap, phải tự xử lý scroll/zoom/text selectionXem PDF đơn giản, offline
MuPDF / PdfiumHiệu suất cao, hỗ trợ form, annotationPhức tạp, size lớn, license (MuPDF AGPL)App chuyên nghiệp PDF
Intent ACTION_VIEWĐơn giản nhất, dùng app người dùngRời khỏi app, không kiểm soát UIMở nhanh, không cần tích hợp

Ví dụ: Sử dụng Android PdfRenderer (API 21+, Offline)

// Chỉ demo concept - cần xử lý ParcelFileDescriptor từ file local
ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
PdfRenderer renderer = new PdfRenderer(fd);
int pageCount = renderer.getPageCount();

for (int i = 0; i < pageCount; i++) {
    PdfRenderer.Page page = renderer.openPage(i);
    Bitmap bitmap = Bitmap.createBitmap(page.getWidth(), page.getHeight(), Bitmap.Config.ARGB_8888);
    page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
    // Hiển thị bitmap lên ImageView
    page.close();
}
renderer.close();
fd.close();

Lưu ý quan trọng với Google Docs Viewer

  • PDF phải publicly accessible (không cần login, không behind firewall).
  • Giới hạn kích thước file ~25MB.
  • Không hoạt động với PDF cần authentication.
  • Google có thể giới hạn request từ cùng IP (rate limiting).
  • Không hỗ trợ điền form, chữ ký, annotation.
  • Cần encode URL: Uri.encode(pdfUrl).

Thư viện PDF viewer khuyến nghị (2024)

  • PDFViewager (github.com/barteksc/AndroidPdfViewer) - Phổ biến, dễ dùng.
  • PdfRendererBasic (Google samples) - Dùng PdfRenderer API native.
  • MuPDF - Mạnh nhất nhưng phức tạp.
  • PSPDFKit - Thương mại, đầy đủ tính năng nhất.