studio programacion libro herramientas fundamentos con avanzado aplicaciones android pdf

programacion - manual de android en pdf



Convierta una página PDF en Bitmap en Android Java (5)

Aquí está el código, espero que ayude. Logré renderizar todas las páginas 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 { }

Necesito convertir el archivo PDF (página PDF) en un mapa de bits (o archivo de imagen) en Android.

1.Utilizó el jar de Pdfbox de Apache. Pero usa algunas clases de Java que no son compatibles con Android. 2. Intenté el tarro de Itext que convierte la imagen a pdf (necesito su operación inversa) Al igual que he probado muchos tarros. Pero no hay resultado positivo.

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);

Obtengo el archivo de imagen,

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

De lo contrario, ¿alguna otra forma de mostrar el archivo pdf en Android usando la función incorporada dentro de la aplicación?


Esta pregunta es un poco vieja, pero hoy tuve que hacer lo mismo, así que esta es mi solución:

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

Además, estoy usando esta library . Y mi archivo pdf contiene solo una página y es una imagen, puede ser en otros casos, debe actualizar su código.

Espero que esto ayude a alguien.


Podemos hacerlo usando Qoppa PDF toolkit.

Pasos a seguir para usar Qoppa PDF toolkit.

Descárguelo de http://www.qoppa.com/android/pdfsdk/download

Este archivo contiene cuatro elementos:

  1. version_history.txt - Este archivo de texto se actualizará con cada nueva versión del kit de herramientas.
  2. qoppapdf.jar: este es el archivo jar principal para el kit de herramientas. Este archivo jar debe agregarse a la ruta de clase para su proyecto.
  3. carpeta de activos: esta carpeta contiene recursos utilizados por el kit de herramientas, como fuentes e íconos. Después de extraer de los archivos zip, tendrá que copiar los archivos dentro de esta carpeta a la carpeta de activos en su proyecto.
  4. Carpeta libs: esta carpeta contiene bibliotecas nativas de Android, estas bibliotecas son necesarias para decodificar ciertas imágenes JPEG así como también imágenes JPEG 2000 que no son compatibles con Android. El contenido de la carpeta libs debe copiarse a la carpeta libs en su proyecto. Si no tiene una carpeta de libs en su proyecto, cree una y copie los contenidos de esta carpeta en ella.

El código es:

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


Resolví este problema. es tan simple como dejar que el dispositivo tenga tiempo para representar cada página.

Para solucionar esto, todo lo que tienes que hacer es cambiar

PDFPage page = pdf_file.getPage(2);

a

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

En primer lugar, para ver un PDF en Android, debe convertir el PDF en imágenes y luego mostrarlas al usuario. (Voy a usar una vista web)

Entonces para hacer esto necesitamos esta library . Es mi versión editada de este git .

Después de haber importado la biblioteca en su proyecto, necesita crear su actividad.

El 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>

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


Sé que esta pregunta es antigua, pero me encontré con este problema la semana pasada, y ninguna de las respuestas realmente funcionó para mí.

Así es como resuelvo este problema sin utilizar bibliotecas de terceros.

Basado en el código del site desarrolladores de Android que usa la clase PDFRenderer de Android (API 21+), escribí el siguiente método:

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; }

el método devuelve una matriz de mapas de bits, un mapa de bits para cada página en el archivo pdf.

El alto y el ancho se calculan en función de esta respuesta para crear imágenes de mejor calidad.