Crear un archivo pdf en Android programáticamente y escribir en él

Intento crear un archivo pdf dentro de mi aplicación, guardarlo en el almacenamiento externo y abrirlo. Guardar un archivo no es un problema para mí, ni abrirlo, mi problema es crear uno y escribir en él. Entonces, después de algunas investigaciones en línea, encontré la siguiente forma de hacerlo:

File file = new File(directoryName, fileName); // Creating output stream to write in the newly created file FileOutputStream fOut = null; try { fOut = new FileOutputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } // Creating a new document Document document = new Document(PageSize.A4, 50, 50, 50, 50); try { PdfWriter.getInstance(document, fOut); // Open the document for writing document.open(); // Write in the document document.add(new Paragraph("Hello world")); document.close(); } catch(DocumentException de) { System.err.println(de.getMessage()); } 

Al ejecutar mi aplicación y ejecutar el código anterior, aparece el siguiente error:

 java.lang.NoClassDefFoundError: Failed resolution of: Ljava/awt/Color; 

¿Alguien sabría cuál es el problema con mi código, o de otra manera que seguramente funcionará para crear y escribir un archivo pdf?

Gracias !

Entonces, aparentemente el código que estaba usando no era compatible con Android, de ahí el error que estaba obteniendo. A continuación encontrará el código correcto que realmente funciona correctamente (para crear un archivo pdf, poner contenido, guardarlo y abrir el archivo recién creado):

PD: para esto, necesitarás agregar el jar de iTextG a tu proyecto:

 // Method for creating a pdf file from text, saving it then opening it for display public void createandDisplayPdf(String text) { Document doc = new Document(); try { String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Dir"; File dir = new File(path); if(!dir.exists()) dir.mkdirs(); File file = new File(dir, "newFile.pdf"); FileOutputStream fOut = new FileOutputStream(file); PdfWriter.getInstance(doc, fOut); //open the document doc.open(); Paragraph p1 = new Paragraph(text); Font paraFont= new Font(Font.COURIER); p1.setAlignment(Paragraph.ALIGN_CENTER); p1.setFont(paraFont); //add paragraph to document doc.add(p1); } catch (DocumentException de) { Log.e("PDFCreator", "DocumentException:" + de); } catch (IOException e) { Log.e("PDFCreator", "ioException:" + e); } finally { doc.close(); } viewPdf("newFile.pdf", "Dir"); } // Method for opening a pdf file private void viewPdf(String file, String directory) { File pdfFile = new File(Environment.getExternalStorageDirectory() + "/" + directory + "/" + file); Uri path = Uri.fromFile(pdfFile); // Setting the intent for pdf reader Intent pdfIntent = new Intent(Intent.ACTION_VIEW); pdfIntent.setDataAndType(path, "application/pdf"); pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); try { startActivity(pdfIntent); } catch (ActivityNotFoundException e) { Toast.makeText(TableActivity.this, "Can't read pdf file", Toast.LENGTH_SHORT).show(); } } 

La clase PdfDocument permite generar un documento PDF a partir del contenido nativo de Android. Al usar esta clase podemos crear pdf y también abrirlo usando PdfRenderer . Código de muestra para crear un archivo pdf

  public void stringtopdf(String data) { String extstoragedir = Environment.getExternalStorageDirectory().toString(); File fol = new File(extstoragedir, "pdf"); File folder=new File(fol,"pdf"); if(!folder.exists()) { boolean bool = folder.mkdir(); } try { final File file = new File(folder, "sample.pdf"); file.createNewFile(); FileOutputStream fOut = new FileOutputStream(file); PdfDocument document = new PdfDocument(); PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(100, 100, 1).create(); PdfDocument.Page page = document.startPage(pageInfo); Canvas canvas = page.getCanvas(); Paint paint = new Paint(); canvas.drawText(data, 10, 10, paint); document.finishPage(page); document.writeTo(fOut); document.close(); }catch (IOException e){ Log.i("error",e.getLocalizedMessage()); } 

Descargue el código fuente desde aquí ( Crear archivo pdf en Android programáticamente )

activity_main.xml:

         

MainActivity.java

 package com.deepshikha.generatepdf; import android.Manifest; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.pdf.PdfDocument; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ Button btn_generate; TextView tv_link; ImageView iv_image; LinearLayout ll_pdflayout; public static int REQUEST_PERMISSIONS = 1; boolean boolean_permission; boolean boolean_save; Bitmap bitmap; ProgressDialog progressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); fn_permission(); listener(); } private void init(){ btn_generate = (Button)findViewById(R.id.btn_generate); tv_link = (TextView)findViewById(R.id.tv_link); iv_image = (ImageView) findViewById(R.id.iv_image); ll_pdflayout = (LinearLayout) findViewById(R.id.ll_pdflayout); } private void listener(){ btn_generate.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn_generate: if (boolean_save) { Intent intent = new Intent(getApplicationContext(), PDFViewActivity.class); startActivity(intent); } else { if (boolean_permission) { progressDialog = new ProgressDialog(MainActivity.this); progressDialog.setMessage("Please wait"); bitmap = loadBitmapFromView(ll_pdflayout, ll_pdflayout.getWidth(), ll_pdflayout.getHeight()); createPdf(); // saveBitmap(bitmap); } else { } createPdf(); break; } } } private void createPdf(){ WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); DisplayMetrics displaymetrics = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); float hight = displaymetrics.heightPixels ; float width = displaymetrics.widthPixels ; int convertHighet = (int) hight, convertWidth = (int) width; // Resources mResources = getResources(); // Bitmap bitmap = BitmapFactory.decodeResource(mResources, R.drawable.screenshot); PdfDocument document = new PdfDocument(); PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(convertWidth, convertHighet, 1).create(); PdfDocument.Page page = document.startPage(pageInfo); Canvas canvas = page.getCanvas(); Paint paint = new Paint(); canvas.drawPaint(paint); bitmap = Bitmap.createScaledBitmap(bitmap, convertWidth, convertHighet, true); paint.setColor(Color.BLUE); canvas.drawBitmap(bitmap, 0, 0 , null); document.finishPage(page); // write the document content String targetPdf = "/sdcard/test.pdf"; File filePath = new File(targetPdf); try { document.writeTo(new FileOutputStream(filePath)); btn_generate.setText("Check PDF"); boolean_save=true; } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "Something wrong: " + e.toString(), Toast.LENGTH_LONG).show(); } // close the document document.close(); } public static Bitmap loadBitmapFromView(View v, int width, int height) { Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); v.draw(c); return b; } private void fn_permission() { if ((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)|| (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) { if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE))) { } else { ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS); } if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE))) { } else { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS); } } else { boolean_permission = true; } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_PERMISSIONS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { boolean_permission = true; } else { Toast.makeText(getApplicationContext(), "Please allow the permission", Toast.LENGTH_LONG).show(); } } } } 

¡Gracias!