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

3

我有一个表单,目前填写后会在提交时发送到指定的电子邮件地址。我想提供其他选项,比如将其保存为PDF文件。该表单是在main.xml布局中完成的。是否可能将xml布局转换为PDF?如果可以,能否向我提供一个好的示例。

非常感谢


谷歌上应该有教程。 - alicanbatur
我能找到的唯一的是从活动中创建而不是从布局中创建的。 - PaulH
我不太清楚这个问题,但你是否看过这个链接:http://stackoverflow.com/questions/7806847/converting-xml-to-pdf-using-styles-from-xsl,它可能会对你有所帮助。还有一个链接是https://dev59.com/anVC5IYBdhLWcg3wsTVi?rq=1。 - surhidamatya
我又发现了这个网址:https://dev59.com/927Xa4cB1Zd3GeqPtb4K?rq=1 - surhidamatya
感谢sur007。阅读第三个链接,似乎没有快速转换XML-PDF的可用选项。 - PaulH
sur007,你知道将XML转换为CSV是否类似吗? - PaulH
2个回答

4

您可以查看此链接:

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>

你可以创建任意数量的页面/模板。
2. 实现视图渲染器
通过扩展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);

2
你可以使用这个,只需几行代码就能轻松实现。
 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生成完成或由于异常而失败时进行通知。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接