Convertir une page PDF en Bitmap dans Android Java

Je dois convertir un fichier PDF (page PDF) en fichier bitmap (ou fichier image) sous Android.

1.Pdfbox utilisé Apache. Mais il utilise des classes Java qui ne sont pas sockets en charge dans Android. 2. J’ai essayé le pot d’Itext qui convertit l’image en pdf (j’ai besoin de son opération inverse) Comme ça j’ai essayé beaucoup de pots. Mais aucun résultat positif.

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 = 0) { offset += numRead; } ByteBuffer buffer = ByteBuffer.NEW(bytes); Ssortingng data = Base64.encodeToSsortingng(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); 

Je reçois le fichier image, entrer la description de l'image ici

Au lieu de, entrer la description de l'image ici

 package com.test123; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import com.sun.pdfview.PDFFile; import com.sun.pdfview.PDFPage; import net.sf.andpdf.nio.ByteBuffer; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.RectF; import android.os.Bundle; import android.util.Base64; public class Test123Activity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); 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 = 0) { offset += numRead; } ByteBuffer buffer = ByteBuffer.NEW(bytes); Ssortingng data = Base64.encodeToSsortingng(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); } catch (Exception e) { e.printStackTrace(); } } } 

Sinon, toute autre façon d’afficher le fichier pdf dans Android en utilisant la fonction intégrée à l’application?

J’ai résolu ce problème. c’est aussi simple que de laisser à l’appareil le temps de rendre chaque page.

Pour résoudre ce problème, il suffit de changer

 PDFPage page = pdf_file.getPage(2); 

à

 PDFPage page = pdf_file.getPage(2, true); 

Tout d’abord, pour afficher un PDF sous Android, vous devez convertir le PDF en images, puis les afficher à l’utilisateur. (Je vais utiliser une webview)

Pour cela, nous avons besoin de cette bibliothèque . C’est ma version éditée de ce git .

Après avoir importé la bibliothèque dans votre projet, vous devez créer votre activité.

Le XML:

     

Le 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() { // create and show a progress dialog ProgressDialog progressDialog = ProgressDialog.show(MainActivity.this, "", "Opening..."); @Override protected void onPostExecute(Ssortingng html) { //after async close progress dialog progressDialog.dismiss(); //load the html in the webview wv.loadDataWithBaseURL("", html, "text/html","UTF-8", ""); } @Override protected Ssortingng 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 ssortingng Ssortingng base64 = Base64.encodeToSsortingng(byteArray, Base64.NO_WRAP); //create the html + add the first image to the html Ssortingng html = "
"; //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 += "
"; } stream.close(); html += ""; return html; } catch (Exception e) { Log.d("error", e.toSsortingng()); } return null; } }.execute(); System.gc();// run GC } catch (Exception e) { Log.d("error", e.toSsortingng()); } }

Cette question est un peu ancienne, mais je devais faire la même chose aujourd’hui, alors voici ma solution:

 /** * 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, Ssortingng 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; } 

De plus, j’utilise cette bibliothèque . Et mon fichier pdf ne contient qu’une seule page et est une image, peut-être dans d’autres cas, vous devez mettre à jour votre code.

J’espère que cela aidera quelqu’un.

Je sais que cette question est ancienne mais j’ai rencontré ce problème la semaine dernière et aucune des réponses n’a vraiment fonctionné pour moi.

Voici comment résoudre ce problème sans utiliser de bibliothèques tierces.

Basé sur le code du site des développeurs Android utilisant la classe PDFRenderer (API 21+) d’android, j’ai écrit la méthode suivante:

 private ArrayList pdfToBitmap(File pdfFile) { ArrayList 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; } 

la méthode renvoie un tableau de bitmaps, un bitmap pour chaque page du fichier pdf.

La hauteur et la largeur sont calculées en fonction de cette réponse pour créer des images de meilleure qualité.

Voici le code, j’espère que ça aide. J’ai réussi à rendre toutes les pages dans Bitmap.Cheers

  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); Ssortingng 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()) { } Masortingx m = pdfViewer.getImageMasortingx(); Rect r = new Rect(0, 0, x, y); renderer.openPage(currentPage).render(bitmap, r, m, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); pdfViewer.setImageMasortingx(m); pdfViewer.setImageBitmap(bitmap); pdfViewer.invalidate(); } catch (Exception ex) { Log.v(TAG, ex.getMessage()); } finally { } 

Nous pouvons le faire en utilisant la boîte à outils Qoppa PDF.

Étapes à suivre pour utiliser la boîte à outils Qoppa PDF.

Téléchargez-le depuis http://www.qoppa.com/android/pdfsdk/download

Ce fichier contient quatre éléments:

  1. version_history.txt – Ce fichier texte sera mis à jour avec chaque nouvelle version du toolkit.
  2. qoppapdf.jar – Ceci est le fichier jar principal du toolkit. Ce fichier jar doit être ajouté au classpath pour votre projet.
  3. Dossier assets – Ce dossier contient les actifs utilisés par le toolkit, tels que les fonts et les icons. Après avoir extrait des fichiers zip, vous devrez copier les fichiers contenus dans ce dossier dans le dossier des ressources de votre projet.
  4. Dossier libs – Ce dossier contient des bibliothèques Android natives, ces bibliothèques sont nécessaires pour décoder certaines images JPEG ainsi que les images JPEG 2000 non sockets en charge par Android. Le contenu du dossier libs doit être copié dans le dossier libs de votre projet. Si vous n’avez pas de dossier libs dans votre projet, créez-en un et copiez-y le contenu de ce dossier.

Le code est:

  //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(); }