如何在Android的WebView中打开本地PDF文件?

rslzwgfq  于 2023-01-03  发布在  Android
关注(0)|答案(9)|浏览(576)

我想在WebView中打开本地(SD卡)PDF文件。
我已经试过了:

webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setPluginsEnabled(true);
webview.getSettings().setAllowFileAccess(true);
File file = new File(Environment.getExternalStorageDirectory() + "/test.pdf");

final Uri uri = Uri.fromFile(file);

webview.loadUrl(uri.toString());

但它仍然无法打开它,所以请告诉我如何在WebView中打开PDF?

x9ybnkn6

x9ybnkn61#

我知道,这个问题是老问题了。
但我真的很喜欢Xamarin使用Mozilla的pdf.js的方法。它可以在旧的Android版本上工作,你不需要一个特殊的PDF查看器应用程序,你可以很容易地在你的应用程序视图层次结构中显示PDF。
Git for this:https://mozilla.github.io/pdf.js/
其他默认选项(如标准缩放):https://github.com/mozilla/pdf.js/wiki/Viewer-options
只需将pdfjs文件添加到您的Assets目录:

我们可以这样称呼它:

// Assuming you got your pdf file:
File file = new File(Environment.getExternalStorageDirectory() + "/test.pdf");

webview = (WebView) findViewById(R.id.webview);
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);
settings.setBuiltInZoomControls(true);
webview.setWebChromeClient(new WebChromeClient());
webview.loadUrl("file:///android_asset/pdfjs/web/viewer.html?file=" + file.getAbsolutePath() + "#zoom=page-width");

很酷的一点:如果你想减少功能/控件的数量,请转到Assets/pdfjs/web/viewer.html文件并将某些控件标记为隐藏。

style="display: none;"

例如,如果您不喜欢右侧的工具栏:

<div id="toolbarViewerRight" style="display: none;">...</div>
    • 更新**

不支持URL方案"file"
可能在较新版本的pdfjs中发生。在版本1.8.188中不会出现此错误。

uurity8g

uurity8g2#

正如@Sameer在上面的评论中所回复的那样,在webview中查看PDF的唯一解决方案是通过Google Docs的在线查看器,该查看器将呈现并发送一个可读版本到您的应用程序。
之前在此讨论过

8iwquhpp

8iwquhpp3#

在浏览了几个帖子之后,我在Quora上找到了this简单答案,它几乎完成了这项工作。
在您的gradle文件中添加此依赖关系:

compile 'com.github.barteksc:android-pdf-viewer:2.0.3'
    • 活动_主要. xml**
<com.github.barteksc.pdfviewer.PDFView
    android:id="@+id/pdfView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     />
    • 主要活动. java**
package pdfviewer.pdfviewer;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.github.barteksc.pdfviewer.PDFView;
import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener;
import com.github.barteksc.pdfviewer.listener.OnPageChangeListener;
import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle;
import com.shockwave.pdfium.PdfDocument;

import java.util.List;

public class MainActivity extends Activity implements OnPageChangeListener,OnLoadCompleteListener{
    private static final String TAG = MainActivity.class.getSimpleName();
    public static final String SAMPLE_FILE = "sample_pdf.pdf";
    PDFView pdfView;
    Integer pageNumber = 0;
    String pdfFileName;

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

        pdfView= (PDFView)findViewById(R.id.pdfView);
        displayFromAsset(SAMPLE_FILE);
    }

    private void displayFromAsset(String assetFileName) {
        pdfFileName = assetFileName;

        pdfView.fromAsset(SAMPLE_FILE)
                .defaultPage(pageNumber)
                .enableSwipe(true)

                .swipeHorizontal(false)
                .onPageChange(this)
                .enableAnnotationRendering(true)
                .onLoad(this)
                .scrollHandle(new DefaultScrollHandle(this))
                .load();
    }

    @Override    public void onPageChanged(int page, int pageCount) {
        pageNumber = page;
        setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));
    }

    @Override    public void loadComplete(int nbPages) {
        PdfDocument.Meta meta = pdfView.getDocumentMeta();
        printBookmarksTree(pdfView.getTableOfContents(), "-");

    }

    public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) {
        for (PdfDocument.Bookmark b : tree) {

            Log.e(TAG, String.format("%s %s, p %d", sep, b.getTitle(), b.getPageIdx()));

            if (b.hasChildren()) {
                printBookmarksTree(b.getChildren(), sep + "-");
            }
        }
    }

}

您必须确保您的资源文件夹包含sample_pdf. pdf(库还支持从Uri和SDCard打开pdf)

快乐编码:)

yyyllmsg

yyyllmsg4#

您不能。使用Intent,您可以在外部查看器应用程序(如Acrobat Reader)中打开PDF:

try
{
 Intent intentUrl = new Intent(Intent.ACTION_VIEW);
 intentUrl.setDataAndType(uri, "application/pdf");
 intentUrl.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 mActivity.startActivity(intentUrl);
}
catch (ActivityNotFoundException e)
{
 Toast.makeText(mActivity, "No PDF Viewer Installed", Toast.LENGTH_LONG).show();
}
smtd7mpg

smtd7mpg5#

从androidOS 5.0(棒棒糖)开始,您可以使用**PdfRenderer instead of webview/library.**您可以使用此类在应用程序中显示pdf。
如果您想支持低于此级别的操作系统,您可以使用其他答案中提到的库/其他方法,因为没有本地支持。
docs了解更多信息,您也可以参考此example

j2cgzkjk

j2cgzkjk6#

你可以使用SkewPdfView库从远程或本地url加载pdf。
首先,在您的根build.gradle中添加以下内容:

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

并将SkewPdfView库添加为:

dependencies {
    implementation 'com.github.naya-aastra:SkewPdfView:1.1'
}

现在在布局中包含SkewPdfView:

<com.nayaastra.skewpdfview.SkewPdfView
    android:id="@+id/skewPdfView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

将所有本地文件保存在assets文件夹中,然后按如下所示使用SkewPdfView。

SkewPdfView skewPdfView;
skewPdfView = findViewById(R.id.skewPdfView);
String pdfLink = "LINK TO ASSET FILE";
skewPdfView.loadPdf(pdfLink);

SkewPdfView库的P.S.链接
SkewPdfView Github Page

cxfofazt

cxfofazt7#

WebView不提供从本地存储打开PDF的直接功能。您可以在外部PDFViewer应用程序中打开PDF。

等待,用户将转到其他应用程序
现在,无需使用任何额外库来打开PDF,我们可以使用PdfRenderer类来渲染PDF。

PdfRenderer可在位图上呈现PDF。位图可绘制到Image View以在应用程序中显示PDF

// create a new renderer
 PdfRenderer renderer = new PdfRenderer(getSeekableFileDescriptor());

 // let us just render all pages
 final int pageCount = renderer.getPageCount();
 for (int i = 0; i < pageCount; i++) {
     Page page = renderer.openPage(i);

     // say we render for showing on the screen
     page.render(mBitmap, null, null, Page.RENDER_MODE_FOR_DISPLAY);

     // do stuff with the bitmap

     // close the page
     page.close();
 }

 // close the renderer
 renderer.close();

docs了解更多信息。

weylhg0b

weylhg0b8#

WebView可以很容易地用于显示来自Web URL的PDF文件,但如果您有本地PDF文件,那么它就变得很痛苦。
在我的情况下,我首先存储了我的本地文件的引用:-

File file = new File(getExternalFilesDir(null),"your_pdf_file.pdf");

然后,我使用FileProvider获取了本地PDF文件的文件路径URI,并启动了一个Intent,以便使用可以打开PDF文档的现有应用程序打开它:-

try{
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(FileProvider.getUriForFile(BaseActivity.this,BuildConfig.APPLICATION_ID +".provider",file), "application/pdf");
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(intent);
    } catch (ActivityNotFoundException e) {
    Toast.makeText(BaseActivity.this,"No Application Available to View PDF",Toast.LENGTH_SHORT).show();
    }

同样要使用FileProvider API,您需要在清单中将其声明为:-

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

并将XML资源文件夹下的file_paths. xml声明为:-

<paths>
    <external-path name="external_files" path="."/>
</paths>
ao218c7q

ao218c7q9#

WebView无法打开.pdf文件。最流行的解决方案(谷歌文档的url +你在WebView中的url)只是显示你由谷歌文档转换的图片。然而仍然没有简单的方法从url打开.pdf。

相关问题