Android View简易生成Pdf
最近有一个需求,要用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相关推荐
- Android 使用PdfDocument生成PDF文件及遇到的问题
一.PdfDocument使用 PdfDocument是Android原生的生成pdf文件的类,这个类的使用可参考: https://developer.android.google.cn/refer ...
- Android使用iText7生成PDF文件
一:添加依赖 implementation 'com.itextpdf:itext7-core:7.1.13' 二:清单文件AndroidManifest.xml 添加权限 <uses-perm ...
- Android环境下生成PDF文件
一.背景 公司需要一个从本地选择图片生成pdf文件并上传的功能,由于Android本身并没有对pdf的支持,这里选择使用一个第三方的库来达成需求. 二.库的选择 2.1 当前主流的库 在众多Java语 ...
- android 原生 bitmap 生成pdf文件
写这篇文章,是因为我编写这块功能时,公司要求能用android原生代码就不要用第三方,所以,我找了好久都没找到谁在用原生代码生成pdf文件,尤其是把bitmap写入pdf中,所以,在这里,我把原生 生 ...
- Android利用zxing生成二维码,识别二维码,中间填充图片超详细、超简易教程
gayhub上的zxing可用于生成二维码,识别二维码 gayhub地址:https://github.com/zxing/zxing 此文只是简易教程,文末附有完整代码和demo下载地址,进入正题: ...
- Android生成pdf文件之PdfDocument及踩过的坑
有时候项目中可能会遇到这样的需求,如何将android中界面显示的内容生成pdf,这里讲述的是使用android原生的PdfDocument,并没有使用框架,其一是使用起来非常的简单,但是也会也到一些 ...
- android pdfjet_GitHub - lnj721/PdfBuilder: Android端使用图片生成PDF文件
PdfBuilder Android端使用图片生成PDF文件 一.应用场景 从本地选择图片生成pdf文件,由于Android本身并没有对pdf的支持,这里选择使用一个第三方的库来达成需求. 二.库的选 ...
- 在Android中利用iText生成PDF
iText 是java和C#中的一个处理PDF的开源类库,国外的大牛已经把它移植到Android上了,但是直接拿来用还是需要花费一点功夫,下面就用一个简单的demo来测试一下. iText项目地址:h ...
- Android View 生成唯一 Id
Android View 生成唯一 Id 可以使用 Hook LayoutInflater 的方法替换 SystemService 原有的 LayoutInflater,在自定义的 LayoutInf ...
最新文章
- vscode中使用js的console配置 - mac
- ssm项目jsp加载不出来图片_16. SSM 搭建
- python输入123输出321_C语言编程:输出一个3位整数的逆序数,如输入123,输出321....
- 【每天一个linux命令】read
- 什么是 IP 地址?
- C++中 #define的用法
- Linux磁盘分区之fdisk命令
- 44个实用的Apache Web Server面试问题及答案
- BZOJ 2756: [SCOI2012]奇怪的游戏
- OBS 录制黑屏的解决方法
- 产品必会的30个Axure使用技巧
- 金士顿U盘修复工具Kingston Format Utility
- 泛运筹理论初探——HANP和BMLPA以及DCLP简介
- ps随意改变图层形态
- Uni-App 启动页和引导页介绍
- 基于微信小程序的共享课本系统 毕业设计毕设参考
- 学物理赶不上计算机,高二上学期物理为何这么难?
- 宝塔php socket,宝塔开启websocket 小程序聊天功能开发
- 切片和切块 钻取 旋转(转)
- stm32—洋桃一号开发板U盘测试相关问题