Android如何将XML布局转换为PDF?

时间:2013-05-10 09:40:20

标签: android xml pdf

我有一张表单,当前填写的表单会在提交时发送到专用的电子邮件地址。我想有机会提供其他选择。就像将其保存为PDF文件一样。表单在main.xml布局中完成。是否可以将xml布局转换为PDF格式?如果是这样,有人会指出我的方向。

非常感谢

2 个答案:

答案 0 :(得分:3)

您可以查看以下链接:

https://github.com/HendrixString/Android-PdfMyXml

说明

  1. 创建XML布局
  2. 首先创建XML布局。根据比例1:1.41给出尺寸,以像素为单位(以及所有它的子视图)和比例,根据风景或肖像。

    page1.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="2115px"
                android:layout_height="1500px"
                android:background="@color/white">
     <TextView android:id="@+id/tv_hello"
                android:textColor="@color/black"
                android:textSize="27px"
                android:textStyle="bold"
                android:padding="6px"/>
    
    </RelativeLayout>
    

    您可以根据需要创建多个页面/模板。

    1. 实施视图渲染器
    2. 通过扩展AbstractViewRenderer或匿名实例化并注入布局ID来实现View渲染器。 initView(视图视图)将自动为您提供充气视图。还有其他选择,但我现在不介绍它。

      AbstractViewRenderer page = new AbstractViewRenderer(context, R.layout.page1) {
      private String _text;
      
      public void setText(String text) {
          _text = text;
      }
      
      @Override
      protected void initView(View view) {
          TextView tv_hello = (TextView)view.findViewById(R.id.tv_hello);
           tv_hello.setText(_text);
      }
      };
      
      // you can reuse the bitmap if you want
      page.setReuseBitmap(true);
      
      1. 构建PDF文档
      2. 使用PdfDocument或PdfDocument.Builder添加页面并使用进度条在后台渲染和运行它。

            PdfDocument doc            = new PdfDocument(ctx);
        
        // add as many pages as you have
        doc.addPage(page);
        
        doc.setRenderWidth(2115);
        doc.setRenderHeight(1500);
        doc.setOrientation(PdfDocument.A4_MODE.LANDSCAPE);
        doc.setProgressTitle(R.string.gen_please_wait);
        doc.setProgressMessage(R.string.gen_pdf_file);
        doc.setFileName("test");
        doc.setInflateOnMainThread(false);
        doc.setListener(new PdfDocument.Callback() {
            @Override
            public void onComplete(File file) {
                Log.i(PdfDocument.TAG_PDF_MY_XML, "Complete");
            }
        
            @Override
            public void onError(Exception e) {
                Log.i(PdfDocument.TAG_PDF_MY_XML, "Error");
            }
        });
        
        doc.createPdf(ctx);
        

        或使用PdfDocument.Builder

        new PdfDocument.Builder(ctx).addPage(page).filename("test").orientation(PdfDocument.A4_MODE.LANDSCAPE)
                                 .progressMessage(R.string.gen_pdf_file).progressTitle(R.string.gen_please_wait).renderWidth(2115).renderHeight(1500)
                                 .listener(new PdfDocument.Callback() {
                                     @Override
                                     public void onComplete(File file) {
                                         Log.i(PdfDocument.TAG_PDF_MY_XML, "Complete");
                                     }
        
                                     @Override
                                     public void onError(Exception e) {
                                         Log.i(PdfDocument.TAG_PDF_MY_XML, "Error");
                                     }
                                 }).create().createPdf(this);
        

答案 1 :(得分:1)

您可以使用此library简化几行代码中的操作-

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="something_brk">
Border Change
</div>
<div class="something">
  No Border Change
</div>
<div class="somethingelse_brk">
Border Change
</div>
<div class="somethingelse">
No Border Change
</div>

此外,您还可以在 PdfGenerator.getBuilder() .setContext(context) .fromLayoutXMLSource() .fromLayoutXML(R.layout.layout_print,R.layout.layout_print) .setDefaultPageSize(PdfGenerator.PageSize.A4) .setFileName("Test-PDF") .build(); 中传递回调(PdfGeneratorListener()),以通知pdf生成是由于异常完成还是失败