How to convert Android View to PDF

前端 未结 4 732
日久生厌
日久生厌 2020-12-10 12:21

I have created an Android Invoice app. The generated invoice is standard Android layout with nested views. I am looking for a library that I can use to convert this view to

4条回答
  •  北海茫月
    2020-12-10 12:52

    Take a screen at your device:

    Bitmap screen;
    View v1 = MyView.getRootView();
    v1.setDrawingCacheEnabled(true);
    screen= Bitmap.createBitmap(v1.getDrawingCache());
    v1.setDrawingCacheEnabled(false);
    

    If you're having ScrollView as root view then:

    LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
    RelativeLayout root = (RelativeLayout) inflater.inflate(R.layout.activity_main, null); //RelativeLayout is root view of my UI(xml) file.
    root.setDrawingCacheEnabled(true);
    Bitmap screen= getBitmapFromView(this.getWindow().findViewById(R.id.relativelayout)); // here give id of our root layout (here its my RelativeLayout's id)
    

    Here is the getBitmapFromView() method:

    public static Bitmap getBitmapFromView(View view) {
        //Define a bitmap with the same size as the view
        Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
        //Bind a canvas to it
        Canvas canvas = new Canvas(returnedBitmap);
        //Get the view's background
        Drawable bgDrawable =view.getBackground();
        if (bgDrawable!=null) 
            //has background drawable, then draw it on the canvas
            bgDrawable.draw(canvas);
        else 
            //does not have background drawable, then draw white background on the canvas
            canvas.drawColor(Color.WHITE);
        // draw the view on the canvas
        view.draw(canvas);
        //return the bitmap
        return returnedBitmap;
    }
    

    It will display entire screen including content hidden in your ScrollView. Now that we have our bitmap screen let's save it to pdf (you have to download itextpdf-5.3.2.jar file and attach in your project..)

    private static String FILE = "mnt/sdcard/invoice.pdf"; // add permission in your manifest...
    
    try 
    {
        Document document = new Document();
    
        PdfWriter.getInstance(document, new FileOutputStream(FILE));
        document.open();
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        screen.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] byteArray = stream.toByteArray();
        addImage(document,byteArray);
        document.close();
    }
    
    catch (Exception e) 
    {
        e.printStackTrace();
    }
    
    private static void addImage(Document document,byte[] byteArray) 
    {
        try 
        {
            image = Image.getInstance(byteArray);  
        } 
        catch (BadElementException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (MalformedURLException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         // image.scaleAbsolute(150f, 150f);
          try 
          {
            document.add(image);
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    

    Haven't tested anything. Here are all the sources I used: source1, source2, source3.

提交回复
热议问题