当前位置:   article > 正文

Android pdf填充表单,预览,图片填充,水印添加_android itextpdf7填写表单并保存

android itextpdf7填写表单并保存

前言

需求是这样的,客户需要用户登录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

  1. String timeWater = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); //获取水印
  2. BaseFont bfChinese = BaseFont.createFont("assets/font/simhei.ttf",
  3. BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//获取中文字体
  4. InputStream open = mContext.getClass().getClassLoader().getResourceAsStream("assets/" + fileServerAsset); //读pdf流
  5. PdfReader reader = new PdfReader(open);//对pdf进行读写
  6. PdfStamper pdfStamper = new PdfStamper(reader, new FileOutputStream(new File(path, fileServerName)));
  7. AcroFields acroFields = pdfStamper.getAcroFields(); //获取pdf表单
  8. Map<String, String> formData = new HashMap<>();
  9. formData.put("identify_number", identify.getId_number());
  10. for (Iterator it = formData.keySet().iterator(); it.hasNext(); ) {//遍历数据填充到表单
  11. String key = (String) it.next();
  12. String value = (String) formData.get(key);
  13. acroFields.setFieldProperty(key, "textfont", bfChinese, null);
  14. acroFields.setField(key, value);
  15. }
  16. PdfContentByte overContent19 = pdfStamper.getUnderContent(19);//追加一页
  17. Image idFontImg = Image.getInstance(id_font_img);//获取图片封装对象
  18. Rectangle rectangleIdFont;
  19. if (idFontImg.getWidth() > idFontImg.getHeight()) {
  20. rectangleIdFont = new Rectangle(400, 300);
  21. } else {
  22. rectangleIdFont = new Rectangle(300, 400);
  23. }
  24. idFontImg.scaleToFit(rectangleIdFont.getWidth(), rectangleIdFont.getHeight());//设置图片位置,及缩放
  25. overContent19.addImage(idFontImg);//将图片添加到pdf
  26. addMaterMark(reader, pdfStamper, bfChinese, timeWater);//追加水印
  27. pdfStamper.setFormFlattening(true); //设置表单之后不可编辑
  28. pdfStamper.close();
  29. reader.close();
  30. //追加水印的方法
  31. private void addMaterMark(PdfReader reader, PdfStamper stamper, BaseFont bfChinese, String timeWater) {
  32. int total = reader.getNumberOfPages() + 1;
  33. PdfContentByte content;
  34. int fontSize = 70;
  35. int rotate = 45;
  36. BaseColor color = BaseColor.GRAY;
  37. // 循环对每页插入水印
  38. for (int i = 1; i < total; i++) {
  39. // 水印的起始
  40. content = stamper.getOverContent(i);
  41. // 开始
  42. content.beginText();
  43. // 设置颜色 默认为蓝色1
  44. content.setColorFill(color);
  45. // 设置字体及字号
  46. content.setFontAndSize(bfChinese, fontSize);
  47. Document document = new Document(reader.getPageSize(1));
  48. float pageWidth = document.getPageSize().getWidth(); //595
  49. float pageHeight = document.getPageSize().getHeight();//841
  50. // content.setTextRise(45);//斜度
  51. // 设置起始位置
  52. // content.setTextMatrix(400, 880);
  53. // content.setTextMatrix((pageWidth-fontSize*stampStr.length())/2+50,(pageHeight-fontSize*stampStr.length())/2+100);
  54. // 开始写入水印
  55. //因为是纯数字 宽度占一半 因为45度 宽度除以 1.414 左右对称 再除以2
  56. int left = (int) ((pageWidth - fontSize * timeWater.length() / 2 / 1.414) / 2);
  57. int top = (int) ((pageHeight - fontSize * timeWater.length() / 2 / 1.414) / 2);
  58. Log.d("tag", "left_" + left);
  59. PdfGState gs = new PdfGState();
  60. gs.setFillOpacity(0.2f);
  61. content.setGState(gs);
  62. content.showTextAligned(Element.ALIGN_LEFT, timeWater, left,
  63. top, rotate);
  64. content.endText();
  65. }
  66. }

3.pdf在线预览

xml

  1. <com.github.barteksc.pdfviewer.PDFView
  2. android:id="@+id/pdf_view"
  3. android:background="@color/error_item_color"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. </com.github.barteksc.pdfviewer.PDFView>
  7. mPDFView.fromFile(new File(fileBean.getFilePath()))
  8. .enableSwipe(true)
  9. .enableAnnotationRendering(true)
  10. .spacing(10) // in dp
  11. .onPageChange(new OnPageChangeListener() {
  12. @Override
  13. public void onPageChanged(int page, int pageCount) {
  14. mTvPageTab.setText(1 + page + "/" + pageCount);
  15. }
  16. })
  17. .pageFitPolicy(FitPolicy.BOTH)
  18. .load();
  1. pdfview添加依赖
  2. 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/

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/319203?site
推荐阅读
相关标签
  

闽ICP备14008679号