前言

需求是这样的,客户需要用户登录app后录入个人信息,然后由手机端帮助将录入的信息填充到pdf,

用户录入的部分图片需要填充到pdf模板的最后面,还需要给每一页pdf都加上水印,生成后给用户预览

分析技术点

1.pdf表单填充

2.pdf水印添加

3.pdf图片填充

4.pdf在线预览

遇到的坑或者问题

1.使用itext进行填充pdf,设置了中文支持,使用pdfview预览pdf,发现部分机型预览填充的内容中有错别字或者不显示

解决方案:外部引入tts字库,弊端 ,生成pdf变大,如果引入tts文件小,则可能填充的内容中有错别字

步骤

1.pdf表单填充

下载 adobe Acrobat DC进行对于PDF模板文件进行表单域添加

2.将编辑后有表单域的 pdf模板存放到 assets文件夹下,下载itext jar包和 itextasian jar包

itext是java用来操作pdf的工具 itextasian辅助包 对于itext进行了中文支持

将自带tts字体包也存放到assets下

3.填充pdf

     String timeWater = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); //获取水印BaseFont bfChinese = BaseFont.createFont("assets/font/simhei.ttf",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//获取中文字体InputStream open = mContext.getClass().getClassLoader().getResourceAsStream("assets/" + fileServerAsset); //读pdf流PdfReader reader = new PdfReader(open);//对pdf进行读写PdfStamper pdfStamper = new PdfStamper(reader, new FileOutputStream(new File(path, fileServerName)));AcroFields acroFields = pdfStamper.getAcroFields();  //获取pdf表单Map<String, String> formData = new HashMap<>(); formData.put("identify_number", identify.getId_number());for (Iterator it = formData.keySet().iterator(); it.hasNext(); ) {//遍历数据填充到表单String key = (String) it.next();String value = (String) formData.get(key);acroFields.setFieldProperty(key, "textfont", bfChinese, null);acroFields.setField(key, value);}PdfContentByte overContent19 = pdfStamper.getUnderContent(19);//追加一页Image idFontImg = Image.getInstance(id_font_img);//获取图片封装对象Rectangle rectangleIdFont;if (idFontImg.getWidth() > idFontImg.getHeight()) {rectangleIdFont = new Rectangle(400, 300);} else {rectangleIdFont = new Rectangle(300, 400);}idFontImg.scaleToFit(rectangleIdFont.getWidth(), rectangleIdFont.getHeight());//设置图片位置,及缩放overContent19.addImage(idFontImg);//将图片添加到pdfaddMaterMark(reader, pdfStamper, bfChinese, timeWater);//追加水印pdfStamper.setFormFlattening(true); //设置表单之后不可编辑pdfStamper.close();reader.close();//追加水印的方法    private void addMaterMark(PdfReader reader, PdfStamper stamper, BaseFont bfChinese, String timeWater) {int total = reader.getNumberOfPages() + 1;PdfContentByte content;int fontSize = 70;int rotate = 45;BaseColor color = BaseColor.GRAY;// 循环对每页插入水印for (int i = 1; i < total; i++) {// 水印的起始content = stamper.getOverContent(i);// 开始content.beginText();// 设置颜色 默认为蓝色1content.setColorFill(color);// 设置字体及字号content.setFontAndSize(bfChinese, fontSize);Document document = new Document(reader.getPageSize(1));float pageWidth = document.getPageSize().getWidth(); //595float pageHeight = document.getPageSize().getHeight();//841
//            content.setTextRise(45);//斜度// 设置起始位置// content.setTextMatrix(400, 880);//  content.setTextMatrix((pageWidth-fontSize*stampStr.length())/2+50,(pageHeight-fontSize*stampStr.length())/2+100);// 开始写入水印//因为是纯数字 宽度占一半  因为45度 宽度除以 1.414   左右对称  再除以2int left = (int) ((pageWidth - fontSize * timeWater.length() / 2 / 1.414) / 2);int top = (int) ((pageHeight - fontSize * timeWater.length() / 2 / 1.414) / 2);Log.d("tag", "left_" + left);PdfGState gs = new PdfGState();gs.setFillOpacity(0.2f);content.setGState(gs);content.showTextAligned(Element.ALIGN_LEFT, timeWater, left,top, rotate);content.endText();}}

3.pdf在线预览

xml

<com.github.barteksc.pdfviewer.PDFViewandroid:id="@+id/pdf_view"android:background="@color/error_item_color"android:layout_width="match_parent"android:layout_height="match_parent">
</com.github.barteksc.pdfviewer.PDFView>mPDFView.fromFile(new File(fileBean.getFilePath())).enableSwipe(true).enableAnnotationRendering(true).spacing(10) // in dp.onPageChange(new OnPageChangeListener() {@Overridepublic void onPageChanged(int page, int pageCount) {mTvPageTab.setText(1 + page + "/" + pageCount);}}).pageFitPolicy(FitPolicy.BOTH).load();
pdfview添加依赖
compile 'com.github.barteksc:android-pdf-viewer:3.0.0-beta.5'

项目地址 https://github.com/caixingcun/PdfCase

itext5  itext7 基于AGPL协议(即开源但限制商用)

查找资料发现 itext2.1.7版本基于 LGPL(以jar包形式添加可以商用)

在添加 itext2.1.7过程中发现 itext2.1.7使用过程中部分参数Color类使用的是 java.awt.Color

android并不支持该类,该类是jdk下的,查找发现有网友已经将 java.awt所在jar rt 打包进来

于是替换jar包 资源地址  资源地址 https://download.csdn.net/download/stephen255/7745329

还发现在 itext修改协议阶段有一个开源版本 github地址  https://github.com/LibrePDF/OpenPDF/

Android pdf填充表单,预览,图片填充,水印添加相关推荐

  1. Taro框架中 Image 和 Video 组件预览图片/视频时添加明显的关闭按钮以关闭全屏预览

    需求 Taro框架中 Image 和 Video 组件预览图片/视频时 添加明显的关闭按钮 以关闭全屏观看,避免用户直接操作返回后导致页面空白(原有消息记录消失 - 重新进入项目首页) [补充] 全屏 ...

  2. H5开发:使用H5、CSS、JS、JQUERY实现从本地选择图片、预览图片、上传图片列表

    需求描述 使用H5.CSS.JS.JQUERY 点击添加图片按钮,从本地选择图片(同名图片不可重复选择),在页面预览选中的图片 点击图片查看大图,点击图片右上角"×"删除此图 点击 ...

  3. android 九宫格带删除,Android--选择多张图片,支持拖拽删除、排序、预览图片

    这篇博客主要写仿微信朋友圈选择图片发朋友圈.整个功能包括加载图片,显示图片.相册文件夹.预览图片,九宫格显示已经选择好的图片等等. 效果图 2019-03-28_11_45_57 [320i].gif ...

  4. 利用aspose实现ppt,doc,docx,pptx,xlsx,xls,txt,图片类型转pdf以及实现在线预览(可用于window和linux上,无水印)

    声明:对于本文章上的这个aspose相关的jar,切勿用于商业用途,后果我概不负责 1,先准备jar 链接:jar连接 提取码:bccn 下载后选中自己合适的 我使用的jar,而我的环境是jdk1.8 ...

  5. Android实现文档在线预览功能

    前段时间,项目中有个需求是实现文档预览的功能,Android要实现该功能要比IOS复杂的多,下面就我调研的情况,总结一下,供大家参考: 一.WebView 网页显示 该方式类似于ios的实现方式,使用 ...

  6. ant design 预览图片_AntD框架的upload组件上传图片时遇到的一些坑

    前言 本次做后台管理系统,采用的是 AntD 框架.涉及到图片的上传,用的是AntD的 upload 组件. 前端做文件上传这个功能,是很有技术难度的.既然框架给我们提供好了,那就直接用呗.结果用的时 ...

  7. JS实现上传图片的三种方法并实现预览图片功能

    在常见的用户注册页面,需要用户在本地选择一张图片作为头像,并同时预览. 常见的思路有两种:一是将图片上传至服务器的临时文件夹中,并返回该图片的url,然后渲染在html页面: 另一种思路是,直接在本地 ...

  8. vue + element-UI 实现图片嵌在表单里,图片和表单一起上传

    ⭐️个人博客:caohongyuan.com,更多分享,欢迎浏览!⭐️ 如下图,需求要实现点击一个按钮,可以让表单的内容和图片一起上传,只请求后台一次! 思路: 1.让图片formData放在表单fo ...

  9. 微信小程序实现发布新闻(上传图片、拷贝图片到服务器上面、预览图片)

    我的qq 2038373094 我做的是微信小程序.网站.手机app,后端java+前端vue.bootstrap框架.原生的html+css+js都会 做过律师在线咨询系统.共享农场手机app.在线 ...

最新文章

  1. 遗传算法与C++实现
  2. 机器学习丨15个最流行的GitHub机器学习项目
  3. MyBatis Mapper Demo
  4. python使用matplotlib绘图sigmoid_使用matplotlib库绘制函数图
  5. (轉貼) ThinkPad鍵盤設計原理和哲學 (NB) (ThinkPad)
  6. Python nose单元测试框架的安装与使用
  7. 对flex深入研究一点
  8. 什么注解可以改变BigDecimal类型的字段返回的小数位数?
  9. lnmp 查看mysql版本_MySQL数据库之Lnmp环境中php-mysql版本问题
  10. android轮播图实现方案,Android轮播图实现教程
  11. google服务框架 闪退_刷入对应谷歌服务框架之后依然闪退怎么办 解决方方攻略...
  12. win7系统如何重启服务器,云骑士解决win7系统重启IIS服务的技巧介绍
  13. matlab怎么根据图像求职,图像处理求职简历模板
  14. 计算机上根号是哪一个,电脑上怎么哪个键是数学中的开根号啊
  15. 【J2EE实验-3】Spring MVC
  16. 2020年 初赛真题
  17. Vetur自定义格式化代码
  18. 趣味数学:解24点游戏小技巧
  19. 1256:献给阿尔吉侬的花束
  20. Fms+Vcam实现flv网络直播

热门文章

  1. ERP和MES破冰之路 [普实MES升级中国“智”造]
  2. Linux 流量控制TC
  3. 董老师又双叒叕送书啦,20本《Python数据分析、挖掘与可视化》
  4. 爬虫(豆瓣电影Top250数据分析)学习笔记
  5. 查询至少选了1班2号同学所选课的所有同学班号、学号
  6. Codeforces 869 A.The Artful Expedient(博弈论)
  7. 打印钻石图形python_Python pandas高效数据处理之绘图
  8. 最新尚硅谷2018SpringBoot教学视频(内含Docker)
  9. [更新ing]sklearn(十六):Nearest Neighbors *
  10. 创新、创业,风险投资介绍。附:2019年热门风险投资人 ( VCPE )