Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android Java中将Pdf页面转换为位图_Android_Pdf - Fatal编程技术网

在Android Java中将Pdf页面转换为位图

在Android Java中将Pdf页面转换为位图,android,pdf,Android,Pdf,我需要在Android中将PDFfile(PDF页面)转换为位图(或图像文件) 1.使用Apache的Pdfbox jar。但是它使用了一些android不支持的java类。 2.尝试将图像转换为pdf的Itext jar(我需要它的反向操作) 像那样,我试过很多罐子。但没有积极的结果 byte[] bytes; try { File file = new File(this.getFilesDir().getAbsolutePath()+"/2010Q2_SDK_Ov

我需要在Android中将PDFfile(PDF页面)转换为位图(或图像文件)

1.使用Apache的Pdfbox jar。但是它使用了一些android不支持的java类。 2.尝试将图像转换为pdf的Itext jar(我需要它的反向操作) 像那样,我试过很多罐子。但没有积极的结果

byte[] bytes;
    try {

        File file = new File(this.getFilesDir().getAbsolutePath()+"/2010Q2_SDK_Overview.pdf");
        FileInputStream is = new FileInputStream(file);

        // Get the size of the file
        long length = file.length();
        bytes = new byte[(int) length];
        int offset = 0;
        int numRead = 0;
        while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
            offset += numRead;
        }


        ByteBuffer buffer = ByteBuffer.NEW(bytes);
        String data = Base64.encodeToString(bytes, Base64.DEFAULT);
        PDFFile pdf_file = new PDFFile(buffer);
        PDFPage page = pdf_file.getPage(2);

        RectF rect = new RectF(0, 0, (int) page.getBBox().width(),
                (int) page.getBBox().height());
      //  Bitmap bufferedImage = Bitmap.createBitmap((int)rect.width(), (int)rect.height(),
         //        Bitmap.Config.ARGB_8888);

        Bitmap image = page.getImage((int)rect.width(), (int)rect.height(), rect);
        FileOutputStream os = new FileOutputStream(this.getFilesDir().getAbsolutePath()+"/pdf.jpg");
        image.compress(Bitmap.CompressFormat.JPEG, 80, os);

       // ((ImageView) findViewById(R.id.testView)).setImageBitmap(image);
byte[]字节;
试一试{
File File=新文件(this.getFilesDir().getAbsolutePath()+“/2010Q2_SDK_Overview.pdf”);
FileInputStream is=新的FileInputStream(文件);
//获取文件的大小
long length=file.length();
字节=新字节[(int)长度];
整数偏移=0;
int numRead=0;
而(偏移量=0){
偏移量+=numRead;
}
ByteBuffer缓冲区=ByteBuffer.NEW(字节);
字符串数据=Base64.encodeToString(字节,Base64.DEFAULT);
PDFFile pdf_file=新的PDFFile(缓冲区);
PDFPage page=pdf_file.getPage(2);
RectF rect=new RectF(0,0,(int)page.getBBox().width(),
(int)page.getBBox().height());
//Bitmap BuffereImage=Bitmap.createBitmap((int)rect.width(),(int)rect.height(),
//位图.Config.ARGB_8888);
位图图像=page.getImage((int)rect.width(),(int)rect.height(),rect);
FileOutputStream os=新的FileOutputStream(this.getFilesDir().getAbsolutePath()+“/pdf.jpg”);
image.compress(Bitmap.CompressFormat.JPEG,80,操作系统);
//((ImageView)findViewById(R.id.testView)).setImageBitmap(图像);
我正在获取图像文件,

而不是,

package com.test123;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入com.sun.pdfview.PDFFile;
导入com.sun.pdfview.PDFPage;
导入net.sf.andpdf.nio.ByteBuffer;
导入android.app.Activity;
导入android.graphics.Bitmap;
导入android.graphics.RectF;
导入android.os.Bundle;
导入android.util.Base64;
公共类Test123Activity扩展了活动{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
字节[]字节;
试一试{
File File=新文件(this.getFilesDir().getAbsolutePath()+“/2010Q2_SDK_Overview.pdf”);
FileInputStream is=新的FileInputStream(文件);
//获取文件的大小
long length=file.length();
字节=新字节[(int)长度];
整数偏移=0;
int numRead=0;
而(偏移量=0){
偏移量+=numRead;
}
ByteBuffer缓冲区=ByteBuffer.NEW(字节);
字符串数据=Base64.encodeToString(字节,Base64.DEFAULT);
PDFFile pdf_file=新的PDFFile(缓冲区);
PDFPage page=pdf_file.getPage(2);
RectF rect=new RectF(0,0,(int)page.getBBox().width(),
(int)page.getBBox().height());
//Bitmap BuffereImage=Bitmap.createBitmap((int)rect.width(),(int)rect.height(),
//位图.Config.ARGB_8888);
位图图像=page.getImage((int)rect.width(),(int)rect.height(),rect);
FileOutputStream os=新的FileOutputStream(this.getFilesDir().getAbsolutePath()+“/pdf.jpg”);
image.compress(Bitmap.CompressFormat.JPEG,80,操作系统);
//((ImageView)findViewById(R.id.testView)).setImageBitmap(图像);
}捕获(例外e){
e、 printStackTrace();
}
}
}

除此之外,是否还有其他方法可以使用应用程序内置的函数在android中显示pdf文件?

我们可以使用Qoppa pdf工具包来实现

使用Qoppa PDF工具包的步骤

从下载

此文件包含四项:

  • version_history.txt–此文本文件将随工具包的每个新版本更新
  • qoppapdf.jar–这是工具箱的主jar文件。这个jar文件需要添加到项目的类路径中
  • 资产文件夹–此文件夹包含工具箱使用的资产,如字体和图标。从zip文件提取后,您需要将此文件夹中的文件复制到项目中的资产文件夹
  • libs文件夹–此文件夹包含本机Android库,需要这些库来解码某些JPEG图像以及Android不支持的JPEG 2000图像。需要将libs文件夹的内容复制到项目中的libs文件夹。如果项目中没有libs文件夹,请创建一个并复制c将此文件夹的内容放入其中
  • 代码是:

            //Converting PDF to Bitmap Image...
            StandardFontTF.mAssetMgr = getAssets();
            //Load document to get the first page
            try {
                PDFDocument pdf = new PDFDocument("/sdcard/PDFFilename.pdf", null);
                PDFPage page = pdf.getPage(0);
    
                //creating Bitmap and canvas to draw the page into
                int width = (int)Math.ceil(page.getDisplayWidth());
                int height = (int)Math.ceil(page.getDisplayHeight());
    
                Bitmap bm = Bitmap.createBitmap(width, height, Config.ARGB_8888);
                Canvas c = new Canvas(bm);
                page.paintPage(c);
    
                //Saving the Bitmap
                OutputStream os = new FileOutputStream("/sdcard/GeneratedImageByQoppa.jpg");
                bm.compress(CompressFormat.JPEG, 80, os);
                os.close();
            } catch (PDFException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    

    我解决了这个问题,简单到让设备有时间渲染每个页面

    要解决这个问题,你所要做的就是改变

    PDFPage page = pdf_file.getPage(2);
    

    首先,要在Android中查看PDF,您必须将PDF转换为图像,然后将其显示给用户

    所以要做到这一点,我们需要这个。这是我编辑的版本

    将库导入项目后,需要创建活动

    XML:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <WebView
                android:id="@+id/webView1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
    
    </LinearLayout>
    
    
    
    java:

    //Imports:
    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Environment;
    import android.util.Base64;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewTreeObserver;
    import android.webkit.WebView;
    import com.sun.pdfview.PDFFile;
    import com.sun.pdfview.PDFImage;
    import com.sun.pdfview.PDFPage;
    import com.sun.pdfview.PDFPaint;
    import net.sf.andpdf.nio.ByteBuffer;
    import net.sf.andpdf.refs.HardReference;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.RandomAccessFile;
    import java.nio.channels.FileChannel;
    
    //Globals:
    private WebView wv;
    private int ViewSize = 0;
    
    //OnCreate Method:
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Settings
        PDFImage.sShowImages = true; // show images
        PDFPaint.s_doAntiAlias = true; // make text smooth
        HardReference.sKeepCaches = true; // save images in cache
    
        //Setup webview
        wv = (WebView)findViewById(R.id.webView1);
        wv.getSettings().setBuiltInZoomControls(true);//show zoom buttons
        wv.getSettings().setSupportZoom(true);//allow zoom
        //get the width of the webview
        wv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
        {
            @Override
            public void onGlobalLayout()
            {
                ViewSize = wv.getWidth();
                wv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
        });
    
        try
        {
            File file = new File(Environment.getExternalStorageDirectory().getPath() + "/randompdf.pdf");
            RandomAccessFile f = new RandomAccessFile(file, "r");
            byte[] data = new byte[(int)f.length()];
            f.readFully(data);
            pdfLoadImages(data);
        }
        catch(Exception ignored)
        {
        }
    }
    
    //Load Images:
    private void pdfLoadImages(final byte[] data)
    {
        try
        {
            // run async
            new AsyncTask<Void, Void, String>()
            {
                // create and show a progress dialog
                ProgressDialog progressDialog = ProgressDialog.show(MainActivity.this, "", "Opening...");
    
                @Override
                protected void onPostExecute(String html)
                {
                    //after async close progress dialog
                    progressDialog.dismiss();
                    //load the html in the webview
                    wv.loadDataWithBaseURL("", html, "text/html","UTF-8", "");
                }
    
                @Override
                protected String doInBackground(Void... params)
                {
                    try
                    {
                        //create pdf document object from bytes
                        ByteBuffer bb = ByteBuffer.NEW(data);
                        PDFFile pdf = new PDFFile(bb);
                        //Get the first page from the pdf doc
                        PDFPage PDFpage = pdf.getPage(1, true);
                        //create a scaling value according to the WebView Width
                        final float scale = ViewSize / PDFpage.getWidth() * 0.95f;
                        //convert the page into a bitmap with a scaling value
                        Bitmap page = PDFpage.getImage((int)(PDFpage.getWidth() * scale), (int)(PDFpage.getHeight() * scale), null, true, true);
                        //save the bitmap to a byte array
                        ByteArrayOutputStream stream = new ByteArrayOutputStream();
                        page.compress(Bitmap.CompressFormat.PNG, 100, stream);
                        byte[] byteArray = stream.toByteArray();
                        stream.reset();
                        //convert the byte array to a base64 string
                        String base64 = Base64.encodeToString(byteArray, Base64.NO_WRAP);
                        //create the html + add the first image to the html
                        String html = "<!DOCTYPE html><html><body bgcolor=\"#b4b4b4\"><img src=\"data:image/png;base64,"+base64+"\" hspace=10 vspace=10><br>";
                        //loop though the rest of the pages and repeat the above
                        for(int i = 2; i <= pdf.getNumPages(); i++)
                        {
                            PDFpage = pdf.getPage(i, true);
                            page = PDFpage.getImage((int)(PDFpage.getWidth() * scale), (int)(PDFpage.getHeight() * scale), null, true, true);
                            page.compress(Bitmap.CompressFormat.PNG, 100, stream);
                            byteArray = stream.toByteArray();
                            stream.reset();
                            base64 = Base64.encodeToString(byteArray, Base64.NO_WRAP);
                            html += "<img src=\"data:image/png;base64,"+base64+"\" hspace=10 vspace=10><br>";
                        }
                        stream.close();
                        html += "</body></html>";
                        return html;
                    }
                    catch (Exception e)
                    {
                        Log.d("error", e.toString());
                    }
                    return null;
                }
            }.execute();
            System.gc();// run GC
        }
        catch (Exception e)
        {
            Log.d("error", e.toString());
        }
    }
    
    //导入:
    导入android.app.Activity;
    导入android.app.ProgressDialog;
    导入android.content.Intent;
    导入android.graphics.Bitmap;
    导入android.os.AsyncTask;
    导入android.os.Bundle;
    导入android.os.Environment;
    导入android.util.Base64;
    导入android.util.Log;
    导入android.view.view;
    导入android.view.ViewTreeObserver;
    导入android.webkit.WebView;
    导入com.sun.pdfview.PDFFile;
    导入com.sun.pdfview.PDFImage;
    导入com.sun.pdfview.PDFPage;
    导入com.sun.pdfview.PDFPaint;
    导入net.sf.andpdf.nio.ByteBuffer;
    导入net.sf.andpdf.refs.HardReference;
    进口
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <WebView
                android:id="@+id/webView1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
    
    </LinearLayout>
    
    //Imports:
    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Environment;
    import android.util.Base64;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewTreeObserver;
    import android.webkit.WebView;
    import com.sun.pdfview.PDFFile;
    import com.sun.pdfview.PDFImage;
    import com.sun.pdfview.PDFPage;
    import com.sun.pdfview.PDFPaint;
    import net.sf.andpdf.nio.ByteBuffer;
    import net.sf.andpdf.refs.HardReference;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.RandomAccessFile;
    import java.nio.channels.FileChannel;
    
    //Globals:
    private WebView wv;
    private int ViewSize = 0;
    
    //OnCreate Method:
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Settings
        PDFImage.sShowImages = true; // show images
        PDFPaint.s_doAntiAlias = true; // make text smooth
        HardReference.sKeepCaches = true; // save images in cache
    
        //Setup webview
        wv = (WebView)findViewById(R.id.webView1);
        wv.getSettings().setBuiltInZoomControls(true);//show zoom buttons
        wv.getSettings().setSupportZoom(true);//allow zoom
        //get the width of the webview
        wv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
        {
            @Override
            public void onGlobalLayout()
            {
                ViewSize = wv.getWidth();
                wv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
        });
    
        try
        {
            File file = new File(Environment.getExternalStorageDirectory().getPath() + "/randompdf.pdf");
            RandomAccessFile f = new RandomAccessFile(file, "r");
            byte[] data = new byte[(int)f.length()];
            f.readFully(data);
            pdfLoadImages(data);
        }
        catch(Exception ignored)
        {
        }
    }
    
    //Load Images:
    private void pdfLoadImages(final byte[] data)
    {
        try
        {
            // run async
            new AsyncTask<Void, Void, String>()
            {
                // create and show a progress dialog
                ProgressDialog progressDialog = ProgressDialog.show(MainActivity.this, "", "Opening...");
    
                @Override
                protected void onPostExecute(String html)
                {
                    //after async close progress dialog
                    progressDialog.dismiss();
                    //load the html in the webview
                    wv.loadDataWithBaseURL("", html, "text/html","UTF-8", "");
                }
    
                @Override
                protected String doInBackground(Void... params)
                {
                    try
                    {
                        //create pdf document object from bytes
                        ByteBuffer bb = ByteBuffer.NEW(data);
                        PDFFile pdf = new PDFFile(bb);
                        //Get the first page from the pdf doc
                        PDFPage PDFpage = pdf.getPage(1, true);
                        //create a scaling value according to the WebView Width
                        final float scale = ViewSize / PDFpage.getWidth() * 0.95f;
                        //convert the page into a bitmap with a scaling value
                        Bitmap page = PDFpage.getImage((int)(PDFpage.getWidth() * scale), (int)(PDFpage.getHeight() * scale), null, true, true);
                        //save the bitmap to a byte array
                        ByteArrayOutputStream stream = new ByteArrayOutputStream();
                        page.compress(Bitmap.CompressFormat.PNG, 100, stream);
                        byte[] byteArray = stream.toByteArray();
                        stream.reset();
                        //convert the byte array to a base64 string
                        String base64 = Base64.encodeToString(byteArray, Base64.NO_WRAP);
                        //create the html + add the first image to the html
                        String html = "<!DOCTYPE html><html><body bgcolor=\"#b4b4b4\"><img src=\"data:image/png;base64,"+base64+"\" hspace=10 vspace=10><br>";
                        //loop though the rest of the pages and repeat the above
                        for(int i = 2; i <= pdf.getNumPages(); i++)
                        {
                            PDFpage = pdf.getPage(i, true);
                            page = PDFpage.getImage((int)(PDFpage.getWidth() * scale), (int)(PDFpage.getHeight() * scale), null, true, true);
                            page.compress(Bitmap.CompressFormat.PNG, 100, stream);
                            byteArray = stream.toByteArray();
                            stream.reset();
                            base64 = Base64.encodeToString(byteArray, Base64.NO_WRAP);
                            html += "<img src=\"data:image/png;base64,"+base64+"\" hspace=10 vspace=10><br>";
                        }
                        stream.close();
                        html += "</body></html>";
                        return html;
                    }
                    catch (Exception e)
                    {
                        Log.d("error", e.toString());
                    }
                    return null;
                }
            }.execute();
            System.gc();// run GC
        }
        catch (Exception e)
        {
            Log.d("error", e.toString());
        }
    }
    
    /**
     * Use this to load a pdf file from your assets and render it to a Bitmap.
     * 
     * @param context
     *            current context.
     * @param filePath
     *            of the pdf file in the assets.
     * @return a bitmap.
     */
    @Nullable
    public static Bitmap renderToBitmap(Context context, String filePath) {
        Bitmap bi = null;
        InputStream inStream = null;
        try {
            AssetManager assetManager = context.getAssets();
            Log.d(TAG, "Attempting to copy this file: " + filePath);
            inStream = assetManager.open(filePath);
            bi = renderToBitmap(context, inStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                inStream.close();
            } catch (IOException e) {
                // do nothing because the stream has already been closed
            }
        }
        return bi;
    }
    
    /**
     * Use this to render a pdf file given as InputStream to a Bitmap.
     * 
     * @param context
     *            current context.
     * @param inStream
     *            the inputStream of the pdf file.
     * @return a bitmap.
     * @see https://github.com/jblough/Android-Pdf-Viewer-Library/
     */
    @Nullable
    public static Bitmap renderToBitmap(Context context, InputStream inStream) {
        Bitmap bi = null;
        try {
            byte[] decode = IOUtils.toByteArray(inStream);
            ByteBuffer buf = ByteBuffer.wrap(decode);
            PDFPage mPdfPage = new PDFFile(buf).getPage(0);
            float width = mPdfPage.getWidth();
            float height = mPdfPage.getHeight();
            RectF clip = null;
            bi = mPdfPage.getImage((int) (width), (int) (height), clip, true,
                    true);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                inStream.close();
            } catch (IOException e) {
                // do nothing because the stream has already been closed
            }
        }
        return bi;
    }
    
     try {
            pdfViewer = (ImageView) findViewById(R.id.pdfViewer);
            int x = pdfViewer.getWidth();
            int y = pdfViewer.getHeight();
            Bitmap bitmap = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_4444);
            String StoragePath= Environment.getExternalStorageDirectory()+ "/sample.pdf";
            File file = new File(StoragePath);
            PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY));
            if (currentPage < 0) {
                currentPage = 0;
            } else if (currentPage > renderer.getPageCount()) {
            }
    
    
            Matrix m = pdfViewer.getImageMatrix();
            Rect r = new Rect(0, 0, x, y);
            renderer.openPage(currentPage).render(bitmap, r, m, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
            pdfViewer.setImageMatrix(m);
            pdfViewer.setImageBitmap(bitmap);
            pdfViewer.invalidate();
    
    
        } catch (Exception ex) {
            Log.v(TAG, ex.getMessage());
        } finally {
    
        }
    
    private  ArrayList<Bitmap> pdfToBitmap(File pdfFile) {
        ArrayList<Bitmap> bitmaps = new ArrayList<>();
    
        try {
            PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY));
    
            Bitmap bitmap;
            final int pageCount = renderer.getPageCount();
            for (int i = 0; i < pageCount; i++) {
                PdfRenderer.Page page = renderer.openPage(i);
    
                int width = getResources().getDisplayMetrics().densityDpi / 72 * page.getWidth();
                int height = getResources().getDisplayMetrics().densityDpi / 72 * page.getHeight();
                bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    
                page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
    
                bitmaps.add(bitmap);
    
                // close the page
                page.close();
    
            }
    
            // close the renderer
            renderer.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    
        return bitmaps;
    
    }
    
    dependencies {
        implementation 'com.tom_roush:pdfbox-android:1.8.10.1'
    }
    
        PDDocument pd = PDDocument.load (new File (in));
        PDFRenderer pr = new PDFRenderer (pd);
        Bitmap bitmap = pr.renderImageWithDPI(0, 300);