簡體   English   中英

如何在應用程序中顯示在線pdf文件

[英]how to display online pdf file within app

我需要在我的應用程序中顯示在線 pdf 文件。 我正在使用第三方 API,但問題是它沒有顯示在線文件,這是我的代碼

compile 'com.github.barteksc:android-pdf-viewer:2.5.1'
compile 'org.apache.commons:commons-io:1.3.2'

我的 xml 文件

    <com.github.barteksc.pdfviewer.PDFView
    android:id="@+id/pdfView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

這是我在 PDFview 中呈現在線 pdf 文件的最終代碼

    Uri uri = Uri.parse("http://www.pdf995.com/samples/pdf.pdf");
    mypdfview =(PDFView)findViewById(R.id.pdfView);


    mypdfview.fromUri(uri)
            .pages(0, 2, 1, 3, 3, 3) // all pages are displayed by default
            .enableSwipe(true) // allows to block changing pages using swipe
            .swipeHorizontal(false)
            .enableDoubletap(true)
            .defaultPage(0)
            .onDraw(this) // allows to draw something on a provided canvas, above the current page
            .onLoad(this) // called after document is loaded and starts to be rendered
            .onPageChange(this)
            .onPageScroll(this)
            .onError(this)
            .onRender(this) // called after document is rendered for the first time
            .enableAnnotationRendering(false) // render annotations (such as comments, colors or forms)
            .password(null)
            .scrollHandle(null)
            .enableAntialiasing(true) // improve rendering a little bit on low-res screens
            .load();

我面臨的問題是我可以顯示資產文件夾中的文件。 但是當我通過uri時它沒有顯示任何內容。 我還在menifest中授予了互聯網權限和外部數據讀取權限。

似乎庫不允許顯示遠程文件。

檢查這個問題:庫不支持遠程文件,您必須自己下載。

在嘗試顯示它之前,您應該在本地下載並存儲該 PDF。

或者,您可以使用 Webview 加載 pdf

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

WebView webView = (WebView) findViewById(R.id.my_webview);
webView.setWebViewClient(new MyWebViewClient());
webView.addView(webView.getZoomControls());
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://docs.google.com/gview?embedded=true&url=" +pdfUrl);

您可以使用 webview 來查看應用程序中的 pdf,而不是使用其他一些控件

String url = "http://docs.google.com/gview?embedded=true&url=" + yourURL;
String doc="<iframe src='"+url+"' width='100%' height='100%' style='border: none;'></iframe>";
WebView web=(WebView)findViewById(R.id.webViewpdf);
webView.getSettings().setJavaScriptEnabled(true); 
webView.loadData(doc, "text/html", "UTF-8");

首先,您應該使用 Asynctask 讀取 pdf 文件,然后加載...

這是對我有用的代碼......

注意這里我使用 pdfview 庫來顯示 pdf

implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'

!!!online_pdf 是包含 pdf 網址的字符串變量

首先使 LOADURL 類擴展 AsyncTask

public class LOADURL extends AsyncTask<String,Void,InputStream>
{
private ProgressDialog progressDialog;
public LOADURL(LoadPDF loadPdf) {

        progressDialog = new ProgressDialog(loadPdf);

    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        progressDialog.setTitle("Please wait");
        progressDialog.setMessage("Fetching PDF from server...");
        progressDialog.setCancelable(false);
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.show();

    }

    @Override
    protected InputStream doInBackground(String... strings) {
        InputStream inputStream = null;
        try
        {
            URL url = new URL(strings[0]);
            HttpURLConnection urlConnection = (HttpURLConnection) 
     url.openConnection();
            if (urlConnection.getResponseCode()==200)
            {

                inputStream = new 
     BufferedInputStream(urlConnection.getInputStream());

            }
        } catch (IOException e) {

            return null;
        }
        return inputStream;
    }

    @Override
    protected void onPostExecute(InputStream inputStream) {
        pdfFileName = getFileName(mypdf);
        pdfViewer.fromStream(inputStream)
                .defaultPage(pageNumber)
                .onPageChange(LoadPDF.this)
                .enableAnnotationRendering(true)
                .onLoad(LoadPDF.this)
                .scrollHandle(new DefaultScrollHandle(LoadPDF.this))
                .spacing(10) // in dp
                .onPageError(LoadPDF.this)
                .onError(LoadPDF.this)
                .onPageError(LoadPDF.this)
                .enableAnnotationRendering(false)
                .enableAntialiasing(true)
                .onRender(LoadPDF.this)
                .load();
        progressDialog.dismiss();
    }

}

之后調用 onCreate View 中的類...

LOADURL loadurl = new LOADURL(LoadPDF.this);
loadurl.execute(online_pdf);

這將幫助您如何在沒有外部應用程序的情況下打開/顯示文檔(.pdf、.doc)?

在您的成績中添加此依賴項:

compile 'com.github.barteksc:android-pdf-viewer:2.0.3'

活動_main.xml

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

    <TextView
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@color/colorPrimaryDark"
        android:text="View PDF"
        android:textColor="#ffffff"
        android:id="@+id/tv_header"
        android:textSize="18dp"
        android:gravity="center"></TextView>

    <com.github.barteksc.pdfviewer.PDFView
        android:id="@+id/pdfView"
        android:layout_below="@+id/tv_header"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    </RelativeLayout>

主活動.java

public class MainActivity extends Activity implements OnPageChangeListener,OnLoadCompleteListener{

    private static final String TAG = MainActivity.class.getSimpleName();
    public static final String SAMPLE_FILE = "android_tutorial.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 + "-");
            }
        }
    }
}

您可以使用 Android SDK 提供的PDFRenderer (在 API 級別 21 中添加)在您的 Android 應用程序中呈現 PDF。 下載 PDF 並將其保存在本地存儲中,然后使用以下代碼在您的應用程序中呈現它。

PdfRendererAdapter.kt

class PdfRendererAdapter(
private val renderer: PdfRenderer?,
private val pageWidth: Int
) : RecyclerView.Adapter<PdfRendererAdapter.ViewHolder>() {

class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    private val imageView: ImageView = view.imageView
    fun bind(bitmap: Bitmap) = imageView.setImageBitmap(bitmap)
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
    ViewHolder(
        LayoutInflater.from(parent.context).inflate(R.layout.pdf_page_item, parent, false)
    )

override fun getItemCount() = renderer!!.pageCount

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val currentPage = renderer?.openPage(position)
    val bitmap = currentPage!!.render(pageWidth)
    holder.bind(bitmap)
}

}

PDFRendererExtensions.kt

fun PdfRenderer.Page.render(width: Int): Bitmap {
val bitmap = createBitmap(width)
render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)
close()
return bitmap
}

private fun PdfRenderer.Page.createBitmap(bitmapWidth: Int): Bitmap {
val bitmap = Bitmap.createBitmap(
    bitmapWidth, (bitmapWidth.toFloat() / width * height).toInt(), Bitmap.Config.ARGB_8888
)

val canvas = Canvas(bitmap)
canvas.drawColor(Color.WHITE)
canvas.drawBitmap(bitmap, 0f, 0f, null)

return bitmap
}

PDFRendererActivity.kt

class PdfRenderActivity : AppCompatActivity() {
private var pdfRenderer: PdfRenderer? = null
private var currentPage: PdfRenderer.Page? = null
private var parcelFileDescriptor: ParcelFileDescriptor? = null

companion object {
    const val FILE_NAME = "testPDF.pdf"
    private const val INTENT_PDF_FILE = "pdf_file"

    fun getCallingIntent(context: Context, pdfFile: File): Intent {
        val intent = Intent(context, PdfRenderActivity::class.java)
        intent.putExtra(INTENT_PDF_FILE, pdfFile)
        return intent
    }
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_pdf_renderer)
    openRenderer()
    showPagesInRecyclerView()
}

private fun showPagesInRecyclerView() {
    currentPage = pdfRenderer!!.openPage(0)
    val pdfAdapter = PdfRendererAdapter(renderer = pdfRenderer, pageWidth = currentPage!!.width)
    currentPage!!.close()
    pdf_rv.adapter = pdfAdapter
    pdf_rv.layoutManager =
        LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
}

public override fun onStop() {
    try {
        closeRenderer()
    } catch (e: IOException) {
        e.printStackTrace()
    }
    super.onStop()
}

private fun openRenderer() {
    val file = intent.extras?.get(INTENT_PDF_FILE) as File
    parcelFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
    if (parcelFileDescriptor != null) {
        pdfRenderer = PdfRenderer(parcelFileDescriptor!!)
    }
}

private fun closeRenderer() {
    pdfRenderer!!.close()
    parcelFileDescriptor!!.close()
}
}

這是在應用程序中加載遠程 pdf 的最佳方式

 WebView  wv = (WebView)findViewById(R.id.webview);
        wv.getSettings().setJavaScriptEnabled(true);
        wv.setWebViewClient(new WebViewClient());
        wv.getSettings().setAllowFileAccess(true);
       String src="http://docs.google.com/gview?embedded=true&url=https://firebasestorage.googleapis.com/v0/b/tuloenaseerapp.appspot.com/o/2_arsh_e_naaz_hq_compressed.pdf?alt=media&token=607c124b-ac28-4560-9854-1fe7d023f813";
        wv.loadUrl(src);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM