En mi aplicación, recibiré un flujo de bytes y lo convertiré en un archivo pdf en la memoria del teléfono. ¿Cómo convierto eso en un pdf? ¿Y mostrarlo en una actividad?
Respuestas:
Algunos teléfonos (como el Nexus One) vienen con una versión de Quickoffice preinstalada, por lo que puede ser tan fácil como enviar el Intent apropiado una vez que haya guardado el archivo en la tarjeta SD.
public class OpenPdf extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.OpenPdfButton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File file = new File("/sdcard/example.pdf");
if (file.exists()) {
Uri path = Uri.fromFile(file);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path, "application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
try {
startActivity(intent);
}
catch (ActivityNotFoundException e) {
Toast.makeText(OpenPdf.this,
"No Application Available to View PDF",
Toast.LENGTH_SHORT).show();
}
}
}
});
}
}
Abra el archivo pdf en webview .
public class MyPdfViewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView mWebView=new WebView(MyPdfViewActivity.this);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setPluginsEnabled(true);
mWebView.loadUrl("https://docs.google.com/gview?embedded=true&url="+LinkTo);
setContentView(mWebView);
}
}
Android-Lollipop (api 21) presenta una nueva API: PdfRenderer
Esta API le permite crear un mapa de bits a partir de una página en un documento PDF.
En breve:
obtenga un descriptor de archivo de búsqueda de su documento pdf:
ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
crear el PdfRenderer
PdfRenderer renderer = new PdfRenderer(fd);
preparar el mapa de bits
Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_4444);
obtener la página PdfRenderer.Page para renderizar
PdfRenderer.Page page = renderer.openPage(pageIndex);
renderizar la página en el mapa de bits preparado
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
ahora puede hacer lo que quiera con el mapa de bits.
tenga en cuenta que los 2 argumentos nulos pueden permitirle recortar alguna parte de la página y realizar una transformación (utilizando una matriz ) del clip
hay otro modo de renderizado: RENDER_MODE_FOR_PRINT . Si necesita este modo, hay algunas pautas para usarlo correctamente: aquí están los detalles .
Esta biblioteca es simple y funciona bien: Visor de PDF de Android https://github.com/barteksc/AndroidPdfViewer
Respuesta anterior ...
Creo que Joan Zapata nos da la mejor y más sencilla solución:
https://github.com/JoanZapata/android-pdfview
¡Te aseguro que funciona!
pdfView.fromAsset(pdfName)
? Intenté usar la ruta absoluta, pero no se encontró el archivo (y estoy seguro de que está allí). Ejemplo: /data/data/package.name/files/images/filename.pdf
Para los archivos PDF locales, puede renderizarlos a través de bibliotecas de terceros. por ejemplo, use la biblioteca MuPDF , sus tipos de archivos admitidos incluyen PDF, PNG y JPEG.
Una deficiencia de MuPDF es que utiliza una biblioteca nativa para cumplir con el objetivo, por lo que no será fácil migrar la aplicación a la plataforma BlackBerry más adelante.
Para abrir un pdf desde una matriz de bytes, puede usar RadaeePDF
, puede hacer lo siguiente en su actividad:
private PDFReader m_vPDF = null;
private Document doc = new Document();
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Global.Init(this);
m_vPDF = new PDFReader(this);
doc.Close();
int ret = m_doc.OpenMem(data, password);
switch( ret )
{
case -1://need input password
finish();
break;
case -2://unknown encryption
finish();
break;
case -3://damaged or invalid format
finish();
break;
case -10://access denied or invalid file path
finish();
break;
case 0://succeeded, and continue
break;
default://unknown error
finish();
break;
}
m_vPDF.open(doc);
setContentView( m_vPDF );
}