Convertir une page Pdf en Bitmap dans Android Java
J'ai besoin de convertir le fichier PDF(page PDF) en Bitmap(ou fichier image) dans Android.
1.Pot Pdfbox utilisé à partir d'Apache. Mais il utilise certaines classes java qui ne sont pas prises en charge dans Android. 2. J'ai essayé Itext jar 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 < 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);
Je reçois le fichier Image,
Au lieu de,
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 < 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);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Sinon, toute autre façon d'afficher le fichier pdf dans Android en utilisant la fonction intégré dans l'application?
5 answers
, j'ai résolu ce problème. c'est aussi simple que de laisser l'appareil avoir le temps de rendre chaque page.
Pour résoudre ce tout ce que vous avez à faire est de changer
PDFPage page = pdf_file.getPage(2);
À
PDFPage page = pdf_file.getPage(2, true);
Tout d'abord pour afficher un PDF dans Android, vous devez convertir le PDF en images, puis les afficher à l'utilisateur. (Je vais utiliser une vue Web)
Donc, pour ce faire, 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 besoin de créer votre activité.
Le 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>
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<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());
}
}
Cette question est un peu ancienne, mais je devais faire la même chose aujourd'hui, donc c'est 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, 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;
}
Aussi, 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 je résous ce problème sans utiliser de bibliothèques tierces.
Basé sur le code des développeurs Android site en utilisant la classe PDFRenderer d'Android (API 21+), j'ai écrit la méthode suivante:
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;
}
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 sur cette réponse pour créer des images de meilleure qualité.
Voici le code, j'espère que cela aide. J'ai réussi à rendre toutes les pages en 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);
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 {
}
Nous pouvons le faire en utilisant Qoppa PDF toolkit.
Étapes à suivre pour utiliser Qoppa PDF toolkit.
Téléchargez-le depuis http://www.qoppa.com/android/pdfsdk/download
Ce fichier contient quatre éléments:
- version_history.txt - Ce fichier texte sera mis à jour à chaque nouvelle version de la boîte à outils.
- qoppapdf.jar - Il s'agit du fichier jar principal de la boîte à outils. Ce fichier jar doit être ajouté au chemin de classe de votre projet.
- dossier des actifs – Ce dossier contient les ressources utilisées par la boîte à outils, telles que les polices et les icônes. Après l'extraction des fichiers zip, vous devrez copier les fichiers de ce dossier dans le dossier assets de votre projet.
- libs folder – 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 qui ne sont pas prises 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();
}