【问题标题】:How to convert Android View to PDF如何将 Android 视图转换为 PDF
【发布时间】:2015-06-26 03:30:58
【问题描述】:

我创建了一个 Android 发票应用。生成的发票是带有嵌套视图的标准 Android 布局。我正在寻找可用于将此视图转换为 pdf 文档的库。

我很惊讶在我的搜索中没有直接的选项,或者也许我最后做了第一件事。或者也许我正在寻找的东西是不可能的。

请有人帮我指出一个可以帮助我从 Android 视图转换或生成 PDF 的工具。我愿意接受免费和适度的付费选择。或者让我知道如果我正在寻找的东西是不可能的。

【问题讨论】:

    标签: android pdf-generation


    【解决方案1】:

    在您的设备上截屏:

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

    如果您将 ScrollView 作为根视图,则:

    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)
    

    这里是getBitmapFromView() 方法:

    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;
    }
    

    它将显示整个屏幕,包括隐藏在您的ScrollView 中的内容。 现在我们有了位图屏幕,让我们将其保存为 pdf(您必须下载 itextpdf-5.3.2.jar 文件并附加到您的项目中......)

    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();
        }
    }
    

    没有测试任何东西。以下是我使用的所有来源:source1source2source3

    【讨论】:

    • 有趣,我正在探索你的建议
    • 酷。让我知道它是否有效...如果您能够在 WebView 中重新创建相同的布局,那么您应该寻找一种方法将 html 保存为 pdf...
    • 谢谢,好主意,它几乎可以工作。然而,它截取了包括操作栏在内的所有内容。它也是最终的pdf也有点模糊。再次感谢您的建议。它让我大开眼界,我将继续看到其他选择。再次感谢您的巨大贡献。
    • 非常感谢@ValOkafor先生
    • 我使用的是相同的代码,但我只看到了一半的 pdf,请任何人帮助我
    【解决方案2】:

    您可以使用自定义库,例如 https://github.com/HendrixString/Android-PdfMyXml。我比任何其他方法更喜欢这个库。只需通过这些。

    但还有另一种方法 - 如何将 Android View 转换为 PDF - 生成包含布局位图的 pdf

    【讨论】:

      【解决方案3】:

      我创建了一个library 来实现这个目标(Getting PDF from Java View objects)。

      主要代码sn-p是-

       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)*/
                      
                                  }
                              });
      

      【讨论】:

        【解决方案4】:

        不使用第三方库,您可以使用在 Android API 19 中引入的PdfDocument。但是请记住,pdf 文件的尺寸将以 postscript 点(1/72 英寸)为单位。因此,在绘制到画布之前,您必须转换视图的尺寸以匹配要求。

        【讨论】:

          猜你喜欢
          • 2020-08-16
          • 1970-01-01
          • 2012-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多