最近有一个需求,要用Android生成一个Pdf,正确的做法是用iText来做,不过这个学习过程比较复杂。今天就分享个Android自带的原生方法。

如果要生成一个已经有的界面的话,就很简单了。这个界面可以是ViewGroup也可以是View。

1. 已有界面生成pdf

        PdfDocument document = new PdfDocument();//1, 建立PdfDocumentPdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(view.getMeasuredWidth(), view.getMeasuredHeight(), 1).create();//2PdfDocument.Page page = document.startPage(pageInfo);view.draw(page.getCanvas());//3document.finishPage(page);//4

步骤1:建立一个空的PdfDocument。

步骤2:建立一个新的page,  注意view的高宽必须大于1。这里内部其实建立一个Canvas.

步骤3:在这个canvas把view画出来。

步骤4:告诉page已经结束。

要重新开始新的一页的话,重复步骤2到4。

最后步骤5:再close.这时候就不能再加page了。

 document.close();//5

接下来就是存入sd卡里了,so easy~

别忘了在manifest加读取权限,Android 6.0以上的也要添加requestPermssion。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
         try {
            String path = Environment.getExternalStorageDirectory() + File.separator + "table.pdf";File e = new File(path);if (e.exists()) {e.delete();}document.writeTo(new FileOutputStream(e));} catch (IOException e) {e.printStackTrace();}

2. 动态加载View生成pdf

但不过我们要生成的Pdf还是要在电脑上看的,手机界面生成的pdf格式的高宽都太小,所以最后用的还是动态加载View。

我们先写一个layout, 叫pdfview.xml, 给他定义一个高宽,宽800dp,高1200dp差不多。适当的加一些padding..

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="@dimen/layout_width"
    android:layout_height="@dimen/layout_height"
    android:paddingBottom="@dimen/page_padding_vertical"
    android:paddingEnd="@dimen/page_padding_horizontal"
    android:paddingStart="@dimen/page_padding_horizontal"
    android:paddingTop="@dimen/page_padding_vertical"> <!-- 里面的随意 -->
在java里,首先inflate一个view, 中间设置内容,最后measure和layout.

注意这里的MeasureSpec是unspecified, 我们的pdfview并没有一个父控件,随意高宽不必受约束。

最后的layout也是确定子控件的位置,不然draw的时候都会一片空白。

       View pdfview = mContext.getLayoutInflater().inflate(R.layout.pdfview, null); //1...//中间findViewById, setText各种设置        pdfview.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), //2, 测量大小View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));pdfview.layout(0, 0, pdfview.getMeasuredWidth(), pdfview.getMeasuredHeight()); //3, 测量位置

3. 异步执行

本文的全部内容实现方法都可以在子线程里实现哦,本以为所有view的inflate都需要在UI线程里完成,其实官方并没有规定这样,比如 new Thread(new MyPdfRunnable()).start();就可以实现以上所有代码。

这样做还是有风险,参考stackoverflow这个帖子,在有些机器上还是会出现底层的报错。

Android View简易生成Pdf相关推荐

  1. Android 使用PdfDocument生成PDF文件及遇到的问题

    一.PdfDocument使用 PdfDocument是Android原生的生成pdf文件的类,这个类的使用可参考: https://developer.android.google.cn/refer ...

  2. Android使用iText7生成PDF文件

    一:添加依赖 implementation 'com.itextpdf:itext7-core:7.1.13' 二:清单文件AndroidManifest.xml 添加权限 <uses-perm ...

  3. Android环境下生成PDF文件

    一.背景 公司需要一个从本地选择图片生成pdf文件并上传的功能,由于Android本身并没有对pdf的支持,这里选择使用一个第三方的库来达成需求. 二.库的选择 2.1 当前主流的库 在众多Java语 ...

  4. android 原生 bitmap 生成pdf文件

    写这篇文章,是因为我编写这块功能时,公司要求能用android原生代码就不要用第三方,所以,我找了好久都没找到谁在用原生代码生成pdf文件,尤其是把bitmap写入pdf中,所以,在这里,我把原生 生 ...

  5. Android利用zxing生成二维码,识别二维码,中间填充图片超详细、超简易教程

    gayhub上的zxing可用于生成二维码,识别二维码 gayhub地址:https://github.com/zxing/zxing 此文只是简易教程,文末附有完整代码和demo下载地址,进入正题: ...

  6. Android生成pdf文件之PdfDocument及踩过的坑

    有时候项目中可能会遇到这样的需求,如何将android中界面显示的内容生成pdf,这里讲述的是使用android原生的PdfDocument,并没有使用框架,其一是使用起来非常的简单,但是也会也到一些 ...

  7. android pdfjet_GitHub - lnj721/PdfBuilder: Android端使用图片生成PDF文件

    PdfBuilder Android端使用图片生成PDF文件 一.应用场景 从本地选择图片生成pdf文件,由于Android本身并没有对pdf的支持,这里选择使用一个第三方的库来达成需求. 二.库的选 ...

  8. 在Android中利用iText生成PDF

    iText 是java和C#中的一个处理PDF的开源类库,国外的大牛已经把它移植到Android上了,但是直接拿来用还是需要花费一点功夫,下面就用一个简单的demo来测试一下. iText项目地址:h ...

  9. Android View 生成唯一 Id

    Android View 生成唯一 Id 可以使用 Hook LayoutInflater 的方法替换 SystemService 原有的 LayoutInflater,在自定义的 LayoutInf ...

最新文章

  1. vscode中使用js的console配置 - mac
  2. ssm项目jsp加载不出来图片_16. SSM 搭建
  3. python输入123输出321_C语言编程:输出一个3位整数的逆序数,如输入123,输出321....
  4. 【每天一个linux命令】read
  5. 什么是 IP 地址?
  6. C++中 #define的用法
  7. Linux磁盘分区之fdisk命令
  8. 44个实用的Apache Web Server面试问题及答案
  9. BZOJ 2756: [SCOI2012]奇怪的游戏
  10. OBS 录制黑屏的解决方法
  11. 产品必会的30个Axure使用技巧
  12. 金士顿U盘修复工具Kingston Format Utility
  13. 泛运筹理论初探——HANP和BMLPA以及DCLP简介
  14. ps随意改变图层形态
  15. Uni-App 启动页和引导页介绍
  16. 基于微信小程序的共享课本系统 毕业设计毕设参考
  17. 学物理赶不上计算机,高二上学期物理为何这么难?
  18. 宝塔php socket,宝塔开启websocket 小程序聊天功能开发
  19. 切片和切块 钻取 旋转(转)
  20. stm32—洋桃一号开发板U盘测试相关问题

热门文章

  1. WPS word表格中的神秘的底色
  2. Godaddy域名申请及设置
  3. 望京,承包了帝都码农圈的魔幻
  4. 王兴的190条程序员技术人生的思考!
  5. 5G通信设备安装,不仅是技术活,更是一门艺术活!(干货图文大全)
  6. 浅谈 Android 的安全启动和完整性保护
  7. 编译原理实验:自上而下语法分析
  8. JAVA操作Excel时文字自适应单元格的宽度设置方法
  9. 设计模式之中介者模式---Mediator Pattern
  10. 3050显卡驱动安装+配置pytorch的cuda环境