【问题标题】:Android How to turn a XML layout into a PDF?Android 如何将 XML 布局转换为 PDF?
【发布时间】:2013-05-04 23:10:27
【问题描述】:

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

非常感谢

【问题讨论】:

标签: android xml pdf


【解决方案1】:

您可以使用此library 使其在几行代码内轻松完成 -

 PdfGenerator.getBuilder()
                        .setContext(context)
                        .fromLayoutXMLSource()
                        .fromLayoutXML(R.layout.layout_print,R.layout.layout_print)
                        .s̶e̶t̶D̶e̶f̶a̶u̶l̶t̶P̶a̶g̶e̶S̶i̶z̶e̶(̶P̶d̶f̶G̶e̶n̶e̶r̶a̶t̶o̶r̶.P̶a̶g̶e̶S̶i̶z̶e̶.A̶4̶)̶ //No Longer Work
                        .setFileName("Test-PDF")
                        .build();

此外,您还可以在 .build() 中传递回调 (PdfGeneratorListener()) 以通知 pdf 生成是否完成或因异常而失败

【讨论】:

    【解决方案2】:

    你可以看看这个链接:

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

    说明

    1. 创建 XML 布局

    首先创建 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. 实现视图渲染器

    通过扩展 AbstractViewRenderer 或匿名实例化它并注入布局 ID 来实现您的视图渲染器。 initView(View view) 会自动为您提供一个膨胀的视图。还有其他选择,但我现在不会介绍。

    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 文档

    使用 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);
    

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 1970-01-01
      • 2013-04-17
      • 2017-12-24
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多