How to convert Android View to PDF

前端 未结 4 730
日久生厌
日久生厌 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:46

    I made a library to achieve this objective (Getting PDF from Java View objects).

    The main code snippet is -

     PdfGenerator.getBuilder()
                            .setContext(context)
                            .fromViewSource()
                            .fromView(targetView) /* "targetView" is the view ,you want to convert PDF */
                /* "fromLayoutXML()" takes array of layout resources.
                 * You can also invoke "fromLayoutXMLList()" method here which takes list of layout resources instead of array. */
                            .setDefaultPageSize(PdfGenerator.PageSize.A4)
                /* It takes default page size like A4,A5. You can also set custom page size in pixel
                 * by calling ".setCustomPageSize(int widthInPX, int heightInPX)" here. */
                            .setFileName("Test-PDF")
                /* It is file name */
                            .setFolderName("FolderA/FolderB/FolderC")
                /* It is folder name. If you set the folder name like this pattern (FolderA/FolderB/FolderC), then
                 * FolderA creates first.Then FolderB inside FolderB and also FolderC inside the FolderB and finally
                 * the pdf file named "Test-PDF.pdf" will be store inside the FolderB. */
                            .openPDFafterGeneration(true)
                /* It true then the generated pdf will be shown after generated. */
                            .build(new PdfGeneratorListener() {
                                @Override
                                public void onFailure(FailureResponse failureResponse) {
                                    super.onFailure(failureResponse);
                    /* If pdf is not generated by an error then you will findout the reason behind it
                     * from this FailureResponse. */
                                }
    
                                @Override
                                public void showLog(String log) {
                                    super.showLog(log);
                    /*It shows logs of events inside the pdf generation process*/ 
                                }
    
                                @Override
                                public void onSuccess(SuccessResponse response) {
                                    super.onSuccess(response);
                    /* If PDF is generated successfully then you will find SuccessResponse 
                     * which holds the PdfDocument,File and path (where generated pdf is stored)*/
                    
                                }
                            });
    
    0 讨论(0)
  • 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.

    0 讨论(0)
  • 2020-12-10 12:55

    You can use a custom library such as https://github.com/HendrixString/Android-PdfMyXml. I prefer this library than any other method. Just Go through these.

    but there is another way - How to convert Android View to PDF - that generate a pdf that contains bitmap of your layout

    0 讨论(0)
  • 2020-12-10 13:02

    Without using a third-party library you can use PdfDocument which was introduced in Android API 19. However, keep in mind that the dimension of the pdf file will be in the postscript point(1/72 inch). Therefore, you have to convert your view's dimension to match the requirement before drawing to the canvas.

    0 讨论(0)
提交回复
热议问题