Quiero desarrollar una aplicación Android que te muestre un único pdf guardado en la misma aplicación sin más.
He mirado por nuestro gran amigo google pero lo mejor que he visto es verlo por un WebView pero yo no quiero que me lo muestre con una URL sino que este guardado en la aplicación y mostrarlo en la pantalla de el móvil y también una tablet etc.. etc..
Hay alguna librería para PDF Android y lo haga o como se hace?
-Si hay un pdfViewer para Android
Y encontre una solucion un tanto mala al parecer:
private WebView wv;
private int ViewSize = 0;
//OnCreate Method:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_application);
//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);
}
});
pdfLoadImages();//load images
}
private void pdfLoadImages()
{
try
{
// run async
new AsyncTask<Void, Void, Void>()
{
// create and show a progress dialog
ProgressDialog progressDialog = ProgressDialog.show(Application.this, "", "Abriendo PDF...");
@Override
protected void onPostExecute(Void result)
{
//after async close progress dialog
progressDialog.dismiss();
}
@Override
protected Void doInBackground(Void... params)
{
try
{
// select a document and get bytes
/*File file = new File("android.resource://com.example.pdfproyect/"+R.raw.berkeley);
RandomAccessFile raf = new RandomAccessFile(file, "r");
FileChannel channel = raf.getChannel();
ByteBuffer bb = ByteBuffer.NEW(channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()));
raf.close();*/
// create a pdf doc
InputStream is = getResources().openRawResource(R.raw.berkeley_interbase);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int in = is.read();
while (in != -1) {
baos.write(in);
in = is.read();
}
ByteBuffer bb = ByteBuffer.NEW(baos.toByteArray());
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() *1.28), (int)(PDFpage.getHeight()*1.28), null, true, true);
//save the bitmap to a byte array
ByteArrayOutputStream stream = new ByteArrayOutputStream();
page.compress(Bitmap.CompressFormat.PNG, 100, stream);
stream.close();
byte[] byteArray = stream.toByteArray();
//convert the byte array to a base64 string
String base64 = Base64.encodeToString(byteArray, Base64.DEFAULT);
//create the html + add the first image to the html
String html = "<!DOCTYPE html><html><body bgcolor=\"#7f7f7f\"><img src=\"data:image/png;base64,"+base64+"\" hspace=2 vspace=2><br>";
//loop through 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()*1.28), (int)(PDFpage.getHeight()*1.28), null, true, true);
stream = new ByteArrayOutputStream();
page.compress(Bitmap.CompressFormat.PNG, 100, stream);
stream.close();
byteArray = stream.toByteArray();
base64 = Base64.encodeToString(byteArray, Base64.DEFAULT);
html += "<img src=\"data:image/png;base64,"+base64+"\" hspace=2 vspace=2><br>";
}
html += "</body></html>";
//load the html in the webview
wv.loadDataWithBaseURL("", html, "text/html","UTF-8", "");
}
catch (Exception e)
{
Log.d("CounterA", e.toString());
}
return null;
}
}.execute();
System.gc();// run GC
}
catch (Exception e)
{
Log.d("error", e.toString());
}
}
Ahora el problema esta en que si el pdf tiene mas de 5 paginas o así se queda pillado y da errores, porque supongo que sera demasiada carga.
Me gustaria ahora hacer que las 3 primeras paginas se cargen y las demás esperen a que el usuario baje hacia abajo para poder verlas.
Gracias.[/b]