一、PdfDocument使用

PdfDocument是Android原生的生成pdf文件的类,这个类的使用可参考:

https://developer.android.google.cn/reference/kotlin/android/graphics/pdf/PdfDocument

https://blog.csdn.net/tangedegushi/article/details/81502394

二、问题及解决

背景:需要动态加载一个View,View里面的内容也是动态添加的(比如动态添加多个TextView)。将View的内容生成Pdf文件。

问题: 生成的pdf是空白的?

解决:发现直接添加在布局文件里的内容可以在生成的PDF文件中显示,而动态添加的显示不出来。查找资料发现

https://blog.csdn.net/weixin_40022240/article/details/80692596,应该是因为动态生成的View没有进行Measure 和Layout 所以没有绘制出来,添加上果然就可以了,问题解决。

实例:

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="800dp"android:layout_height="1200dp"><ScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:id="@+id/ll_ecg_pdf"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"></LinearLayout></ScrollView></LinearLayout>

代码: 根据数据向LinearLayout内动态添加绘制了心电图的View,之后将View生成pdf文件

 public void generatePdf(String historyTime){String pdfFilePath = BASE_PATH + File.separator + historyTime+".pdf";File pdfFile = new File(pdfFilePath);File baseFile = new File(BASE_PATH);if(!baseFile.exists()) {baseFile.mkdir(); }if(pdfFile.exists()){pdfFile.delete();}int onePageHeight = Utils.dip2px(mContext, 250)*2;  //每页高度int pdfCount = 2;                            //总页数PdfDocument document = new PdfDocument();//1, 建立PdfDocument/*  生成单页PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(1080, onePageHeight, 1)// .setContentRect(new Rect(0,60,1080,onePageHeight+60)).create();//2 crate a page descriptionPdfDocument.Page page = document.startPage(pageInfo); //3、start a pageCanvas canvas = page.getCanvas();Log.d("ttt","the mLlEcgPdf width:"+mLlEcgPdf.getWidth()+ "; height:"+mLlEcgPdf.getHeight());measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), //2, 测量大小View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));layout(0, 0,mLlEcgPdf.getMeasuredWidth(), mLlEcgPdf.getMeasuredHeight()); //3, 测量位置draw(canvas);document.finishPage(page);///5、finish the page
*///生成多页的pdffor (int i = 0; i < pdfCount; i++) {PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(1080, onePageHeight, pdfCount)//  .setContentRect(new Rect(0,60,mLlEcgPdf.getWidth(),onePageHeight+60)).create();//2 crate a page descriptionPdfDocument.Page page = document.startPage(pageInfo); //3、start a pageCanvas canvas = page.getCanvas();canvas.translate(0,-onePageHeight*i);measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), // 测量大小View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));layout(0, 0,mLlEcgPdf.getMeasuredWidth(), mLlEcgPdf.getMeasuredHeight()); // 测量位置mLlEcgPdf.draw(canvas);//4、 draw something on the pagedocument.finishPage(page);///5、finish the page}try {document.writeTo(new FileOutputStream(pdfFile)); //write the document content// Toast.makeText(ECGActivity.this,"文件已生成,存储路径:"+BASE_PATH ,Toast.LENGTH_SHORT).show();AlertDialog dialog = new AlertDialog.Builder(mContext).setTitle("").setMessage("文件已生成,存储路径:"+BASE_PATH).create();dialog.show();} catch (IOException e) {e.printStackTrace();}document.close(); //close the document}

重点就是添加

    measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), //2, 测量大小View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));layout(0, 0,mLlEcgPdf.getMeasuredWidth(), mLlEcgPdf.getMeasuredHeight()); //3, 测量位置mLlEcgPdf.draw(canvas);

通过测量measure,布局layout,绘制draw,将动态添加的View绘制出来,注意这里的MeasureSpec是unspecified, 我们的pdfview并没有一个父控件,随意高宽不必受约束,layout也是确定子控件的位置。没有上面代码将导致生成的Pdf 空白。

其中生成多页的Pdf文件参考:

https://blog.csdn.net/MikoGodZd/article/details/51767848

Android 使用PdfDocument生成PDF文件及遇到的问题相关推荐

  1. android 原生 bitmap 生成pdf文件

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

  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生成pdf文件之PdfDocument及踩过的坑

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

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

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

  6. java 制作pdf模板,Java-pdf模板制作流程-使用pdf 模板生成pdf文件

    Java 使用pdf 模板生成pdf文件 --制作流程 1.      使用工具 adobe acrobat dc.word 2015 2.      使用 word 繪制一個 3*5 的表格並保存, ...

  7. android 在线预览pdf文件

    android原生webView不支持预览pdf文件,ios却可以,所以android想要实现在线预览webView要通过其他方法,有以下几种方法: 1.andorid原生自带的pdf管理库,主要提供 ...

  8. 前端生成PDF 文件教程+在线demo案例

    个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 PDF 简介 PDF 全称Portable Document Format (PDF)(便携文档格式),该格式的显示与操作系统.分辨 ...

  9. android中打开查看pdf文件可用mupdf

    项目中用到过mupdf第三方库来开发android应用直接打开pdf文件的功能,为了更多的了解mupdf库上网找资料发现一篇个人文章写的还不错,拿来记录一下: 一时兴起 因为自己前段时间一直在做故事会 ...

最新文章

  1. Requests 2.18.1文档
  2. Spring MVC 参数自动绑定List的解决方案
  3. 小黄鸡 php,PHP调用小黄鸡 api post发送
  4. 《Go语言程序设计》读书笔记(二)函数
  5. 一个请求在Struts2框架中的处理的步骤
  6. linux学习笔记:明白Linux文件的属主和属组概念
  7. 关于数据库“事务”“索引”“实例”的含义
  8. 数学建模-非线性优化模型
  9. 如何将音频从视频分离到单独的音轨?
  10. luarocks安装
  11. 坚果pro2刷回官方_锤子坚果Pro2刷魔趣、刷回官方踩坑记
  12. 椭圆部分面积计算公式及微积分推导过程
  13. oracle dba 培训教程 第15章 管理角色
  14. Redux-前端开发者的福音
  15. (最优化理论与方法)第一章最优化简介-第一节:最优化问题概括
  16. Panda3D如何加载obj格式的3D模型文件
  17. Exchange的常用的命令(更新中)
  18. Python sublime 中文的问题汇总【收藏】
  19. 图书销售系统需求规格说明书
  20. 下级对上级回复已阅知_常见公文批示用语

热门文章

  1. 数据结构上机作业4. n阶魔方(n为奇数)
  2. ES6折腾记-模板字符串
  3. 黑群晖虚拟机安装步骤记录
  4. 香港大学HKU CS MSc 面试经历(20fall)
  5. 计算机多媒体思政课,关于思政课多媒体教学存在的问题及对策论文
  6. 替代微软txt文本编辑器_如何在Microsoft Excel中向对象添加替代文本
  7. Unity UGUI 滚动列表
  8. 移动硬盘物理结构与详解
  9. 体育赛事系统开发方案
  10. Javascript 超速入门【讲师辅导】-曾亮-专题视频课程