一、需求

这些日志在写App程序,有这么一个需求,就是需要生成格式统一的一个pdf文件,并向固定表格中填充数据,并且再在pdf中追加两页图片。

二、方案

手工设计一个pdf模板,这个具体步骤就不再赘述,可以网上搜索。说一下模板制作的简单步骤:

1、 用word制作你需要的表单模板
2、 把word制作好的表单模板,另存为pdf格式。
3、 用pdf编辑器(我用的迅捷pdf编辑器),打开pdf,然后进行表单编辑,在需要填充数据的的表格放入文本控件。
4、 另存为pdf模板。

这个模板就是App读取并进行操作的pdf模板,通过这个模板就可以把数据填充到pdf中,并重新生成一个新的pdf文件。

三、下面是代码部分,用到的jar包请看我的其他博文介绍,这里就不再赘述。

android.icu.text.SimpleDateFormat simpleDateFormat =
new android.icu.text.SimpleDateFormat("HHmmss");// HH:mm:ss
//设置默认时区
simpleDateFormat.setTimeZone(android.icu.util.TimeZone.getTimeZone("GMT+8:00"));
//获取当前时间
Date date2 = new Date(System.currentTimeMillis());
String sim2 = simpleDateFormat.format(date2); String folderName_WaterImage = "WaterImage";
String folderName_WaterDB = "WaterDB";
String folderName_WaterPdf = "WaterPdf"; File sdCardDir_PdfTemplate = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOWNLOADS), folderName_WaterDB);
File sdCardDir_WaterPdf = new File(Environment.getExternalStorageDirectory(),
folderName_WaterPdf);
File sdCardDir_WaterImage = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOWNLOADS), folderName_WaterImage); //模板路径
String templatePath = sdCardDir_PdfTemplate + "/" + "WaterTemplate.pdf";
//生成的新文件路径
String newPDFPath = sdCardDir_WaterPdf + "/" +
mWaterInfo.SamplingDate + "_" + mWaterInfo.WellNumber + "_" + sim2 + ".pdf"; String imagePath1 = sdCardDir_WaterImage + "/" + "Image" + id + "_1";
String imagePath2 = sdCardDir_WaterImage + "/" + "Image" + id + "_2"; /**
* 使用中文字体
* 如果是利用 AcroFields填充值的不需要在程序中设置字体,在模板文件中设置字体为中文字体就行了
*/
BaseFont bf = null;
try {
bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//Font FontChinese = new Font(bf, 12, Font.NORMAL); //下面是我需要填充的数据,String格式
String[] strDate = mWaterInfo.SamplingDate.split("-");
String[] str = {
mWaterInfo.WellNumber, mWaterInfo.Longitude + "," + mWaterInfo.Latitude,
strDate[0], strDate[1], strDate[2], mWaterInfo.SamplingTime,
mWaterInfo.SampleMethods, mWaterInfo.SampleDepth, mWaterInfo.Temperature,
mWaterInfo.Weather, mWaterInfo.WaterLevel, mWaterInfo.WaterTemp1,
mWaterInfo.ORP1, mWaterInfo.DO1, mWaterInfo.pH1, mWaterInfo.CT1, mWaterInfo.NTU1,
mWaterInfo.Smell, mWaterInfo.Thing, mWaterInfo.Color, mWaterInfo.SamplingName,
mWaterInfo.RecordingName, mWaterInfo.ReagenInfo, mWaterInfo.bkInfo};
//这个是pdf模板制作时,插入的文本控件名称
String[] it = new String[]{
"Text1", "Text2", "Text3", "Text4", "Text5", "Text6", "Text7",
"Text8", "Text9", "Text10", "Text11", "Text12", "Text13", "Text14", "Text15",
"Text16", "Text17", "Text18", "Text19", "Text20", "Text21", "Text22",
"Text23", "Text24"}; PdfReader reader = new PdfReader(templatePath);//对pdf进行读写
PdfStamper pdfStamper = null;
try {
pdfStamper = new PdfStamper(reader, new FileOutputStream(new File(newPDFPath)));
} catch (DocumentException e) {
e.printStackTrace();
}
AcroFields acroFields = pdfStamper.getAcroFields(); //获取pdf表单
Map<String, String> formData = new HashMap<>();
//formData.put("identify_number", identify.getId_number()); int len = it.length;
//把所有的控件都填入相应的数据
for (int i = 0; i < len; i++) {
acroFields.setFieldProperty(it[i], "textfont", bf, null);
try {
acroFields.setField(it[i], str[i]);
} catch (DocumentException e) {
e.printStackTrace();
}
} PdfContentByte overContent2 = pdfStamper.getUnderContent(2);//追加一页
PdfContentByte overContent3 = pdfStamper.getUnderContent(3);//追加一页
Image idFontImg2 = Image.getInstance(imagePath1);//获取图片封装对象
Image idFontImg3 = Image.getInstance(imagePath2);//获取图片封装对象
Rectangle rectangleIdFont; rectangleIdFont = new Rectangle(PageSize.A4.getWidth(), PageSize.A4.getHeight()); //设置图片位置,及缩放
idFontImg2.scaleToFit(rectangleIdFont.getWidth(), rectangleIdFont.getHeight());
idFontImg3.scaleToFit(rectangleIdFont.getWidth(), rectangleIdFont.getHeight());
try {
float x = rectangleIdFont.getLeft();
float y = rectangleIdFont.getBottom();
idFontImg2.setAbsolutePosition(x, y);
idFontImg3.setAbsolutePosition(x, y);
overContent2.addImage(idFontImg2);//将图片添加到pdf
overContent3.addImage(idFontImg3);//将图片添加到pdf
} catch (DocumentException e) {
e.printStackTrace();
}
//addMaterMark(reader, pdfStamper, bfChinese, timeWater);//追加水印
pdfStamper.setFormFlattening(true); //设置表单之后不可编辑
try {
pdfStamper.close();
} catch (DocumentException e) {
e.printStackTrace();
}
reader.close(); Toast.makeText(this, "导出pdf成功", Toast.LENGTH_LONG).show();

四、

程序调试了三四天,中间是各种问题,各种bug,各种报错,终于调试成功。

欢迎交流!

Android iText向pdf模板插入数据和图片的更多相关文章

  1. C#操作word模板插入文字、图片及表格详细步骤

    c#操作word模板插入文字.图片及表格 1.建立word模板文件 person.dot用书签 标示相关字段的填充位置 2.建立web应用程序 加入Microsoft.Office.Interop.W ...

  2. iText操作pdf(生成,导入图片等)

    生成pdf有很多种方法,用pdfbox也很方便,今天我要写的是用iText 主要在pom.xml中配置的jar包如下 <dependency> <groupId>com.low ...

  3. [转]C#操作word模板插入文字、图片及表格详细步骤

    c#操作word模板插入文字.图片及表格 1.建立word模板文件 person.dot用书签 标示相关字段的填充位置 2.建立web应用程序 加入Microsoft.Office.Interop.W ...

  4. Itext读取PDF模板文件渲染数据后创建新文件

    Maven导入依赖 <properties> <itextpdf.version>5.5.0</itextpdf.version> <itext-asian. ...

  5. 新知识:Java 利用itext填写pdf模板并导出(昨天奋战到深夜四点,知道今天两点终于弄懂)

    废话少说,不懂itext干啥用的直接去百度吧. ***************制作模板******************* 1.先用word做出界面 2.再转换成pdf格式 3.用Adobe Acr ...

  6. 使用poi根据模版生成word文档,支持插入数据和图片

    一.制作word模版,${xxxx}是一会要替换的内容,最下面的表格是要插入数据,根据是否以$开头来判断是需要替换还是插入数据, 注意如果是需要插入数据,制作的表格模版需要一行空行,也只能有一行空行, ...

  7. Android根据pdf模板生成pdf文件

    我们需要生成一些固定格式的pdf文件或者一些报表数据,那么我们可以用 iText包去做. 需要包含的jar包:iText-5.0.6.jar    iTextAsian.jar ,怎样jar包导入工程 ...

  8. 不会吧不会吧,还有开发不会Java填充PDF模板数据的,赶紧看看吧

    思路 根据业务需求,获取实际业务数据,借助itext库功能,将业务数据填充入提前制作好的PDF模板中 操作步骤 制作PDF模板:提前下载好Adobe Acrobat Pro DC 效果展示 准备PDF ...

  9. android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本)

    原地址 :http://www.cnblogs.com/wangmars/p/3914090.html SQLite,是一款轻型的数据库,被广泛的运用到很多嵌入式的产品中,因为占用的资源非常少,二其中 ...

随机推荐

  1. 某毒霸网站存在信息泄露和sql注入

    通过钟馗之眼搜索目标网站的证书使用者找到信息泄露的网站, 点击上图中的edit会跳转 手工注入sql发现有效 that's all

  2. Java进阶:基于TCP通信的网络实时聊天室

    目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...

  3. JavaScript 正则匹配中文,中文符号,空格,全数字,以https:// 开头的url,用于各种场景的输入校验

    业务场景1: 密码输入框需要验证输入中文,中文符号,空格等情况,以便于给出错误提示 业务场景2: 输入框只允许输入数字的情况 业务场景3: 输入框允许输入均为数字或以https:// 开头的url的情 ...

  4. 6.自定义view-侧边字母导航LetterNavigationBar

    1.效果 2.实现原理 1.绘制右侧的字母 2.onTouchEvent 中获取点击.滑动的位置,在通过invalidate() 去重新绘制, ​ 回调给activity去处理中间显示的文字 核心代码 ...

  5. jdbc编程学习之增删改查(2)

    一,enum类型的使用 在SQL中没有布尔类型的数据,我们都使用过布尔类型,当属性的值只用两种情况时.例如性别等.那在数据库对这些属性的值个数比较少时我们应该使用什么数据类型呢?SQL给我们提供了枚举 ...

  6. django-mdeditor支持七牛云存储图片

    由于django-mdeditor官方插件没有支持第三方存储,所以,我们只能进行修改源码的方式实现了. 本次改写即使替换了其文件,不使用七牛云也是无关紧要的,因为在存储时,去settings.py中判 ...

  7. Spring Data JPA简介 Spring Data JPA特点

    Spring Data JPA 是Spring基于ORM框架.JPA规范的基础上封装的一套JPA 应用框架,底层使用了Hibernate 的JPA技术实现,可使开发者用极简的代码即可实现对数据的访问和 ...

  8. Redis如何做内存优化?

    1.缩减键值对象 缩减键(key)和值(value)的长度, key长度:如在设计键时,在完整描述业务情况下,键值越短越好. value长度:值对象缩减比较复杂,常见需求是把业务对象序列化成二进制数组 ...

  9. 指令重排序 as-if-serial

    笔者认为看完一本书或刚要了解完一个知识点  最好自己先运行一些DEMO 自己尝试着去了解下各种意思  这样知识点最终一定是你的.靠死记硬背的讨论或简单的粗暴的看下资料 脑子里肯定还是一团浆糊. p.p ...

  10. Failed to create Spark client for Spark session

    最近在hive里将mr换成spark引擎后,执行插入和一些复杂的hql会触发下面的异常: org.apache.hive.service.cli.HiveSQLException: Error whi ...