本发明涉及计算机技术领域,具体地说是一种实用性强、数据导出为PDF的方法。
背景技术:
PDF是我们极其常用的文件格式,但对如何生成PDF,基于一些公开的PDF库,我们就可以直接生成PDF文件,而不用关注PDF文件的内部细节。PDF导出功能应用系统都是通过itext提供的开源jar包进行固定一对一的导出,对于开发人员来说不易维护,开发成本比较高。
基于此,现提供一种数据导出为PDF的方法。本方法通过PDF模板和数据对应来生成PDF数据,对于应用系统来说开发成本和易维护程度都是比较大的提高。
技术实现要素:
本发明的技术任务是针对以上不足之处,提供一种实用性强、数据导出为PDF的方法。
一种数据导出为PDF的方法,其具体实现过程为:
一、首先建立PDF组件包目录结构,该目录结构对应PDF模板;
二、根据该目录结构,输入PDF模板编号;
三、根据PDF模板编号读取PDF模板;
四、解析读取的PDF模板,获取并填充完变量信息,将该PDF对外输出。
步骤一中根据功能分类建立程序包目录结构:PDF导出工具类包、PDF配置属性包、PDF模板包、PDF生成文件包。
输入PDF模板编号时,需要对应接口完成信息输入,该接口由java接口类定义,且完成接收导出数据和模板信息传入的功能,即接口调用方传入的数据。
所述对应接口由接口类定义,且接受List<Map<String,Object>>类型,Map<String, Object>类型。
读取PDF模板时,通过以下步骤实现:
根据接口调用方传入的PDF模板编号对PDF模板进行读取;
在接口中定义“PDF_NO”参数表示PDF模板编号;
通过读取PDF配置属性包、PDF模板包获取对应模板信息。
所述PDF配置属性包、PDF模板包通过工具类包中的工具类读取,具体为:
工具类通过读取PDF配置属性包下的文件读取到所有模板编号对应的模板信息;
工具类通过模板信息采用文件流的形式读取PDF模板包下对应的模板文件信息,并形成PdfStamper对象,进而获取AcroFields对象。
所述步骤四中,解析模板标记获得每一个标记的替换变量信息,把对应变量数据进行填充,并把PDF暂存到服务器端,最后将PDF提供对外输出。
步骤四的具体过程为:根据读取到的PDF模板进行解析,获得每个标记的数据变量名称,并根据接口调用方提供的数据进行匹配对应输出,最后将生成的PDF数据存储到服务器端,并以输出流的方式向客户端输出提供客户保存。
基于获取的AcroFields对象,步骤四的实现过程为:
通过以上步骤获得的AcroFields对象获取模板中获得每个标记的元素信息,通过循环业务传入Map,找到Map中key值对应的标记元素中name属性,把该key对应的value值赋予标记元素中的value值,再把放到AcroFields域中,最后将生成的PDF文件以模板号和时间戳组合命名存储到服务器端PDF生成文件包下,并以输出二进制流的方式向客户端输出提供客户保存。
本发明的一种数据导出为PDF的方法,具有以下优点:
该发明的一种数据导出为PDF的方法,当用户需求改变修改PDF模板时,不需要重新修改大量的程序代码,只需要将更新的模板覆盖上传就可以达到导出下载功能,方便用户对数据进行导出为PDF功能,提高了导出PDF的开发成本和导出易维护程度;简单实用、提高系统开发效率、减少系统维护成本、提高系统使用效率,实用性强,适用范围广泛,易于推广。
附图说明
附图1为本发明的实现流程图。
具体实施方式
下面结合附图及具体实施例对本发明作进一步说明。
如附图1所示,本发明涉及一种数据导出为PDF的方法,可实现当用户需求改变修改PDF模板时,不需要重新修改大量的程序代码,只需要将更新的模板覆盖上传就可以达到导出下载功能。
本方法把生成PDF改为通过模板生成PDF文件导出;且通过java封装成工具,可实时移植使用。
其实现过程为:
一、首先建立PDF组件包目录结构,该目录结构对应PDF模板;
二、根据该目录结构,输入PDF模板编号;
三、根据PDF模板编号读取PDF模板;
四、解析读取的PDF模板,获取并填充完变量信息,将该PDF对外输出。
具体实现过程如下所述:
步骤1:建立PDF组件包目录结构。
根据各功能分类建立程序包目录结构,如下:
PDF导出工具类包:“com.pdf.export”;
PDF配置属性包:“com.pdf.property”;
PDF模板包:“com.pdf.template”;
PDF生成文件包:“com.pdf.produce”。
步骤2:接收导出数据和模板信息传入。
根据接口类定义的数据传入类型接收接口调用方传入的数据,接口类定义的数据可以接受List<Map<String,Object>>类型,Map<String, Object>类型。由于PDF模板信息一般是键值对的形式,所以传入数据最多的一般是Map<String, Object>类型。为防止文字乱码,统一对于文字进行字体处理。
步骤3:读取PDF模板。
根据接口调用方传入的PDF模板编号对PDF模板进行读取;
接口中定义“PDF_NO”参数表示PDF模板编号,
工具类通过读取“com.pdf.property”包下的template.properties文件读取到所有模板编号对应的模板信息;
工具类通过模板信息采用文件流的形式读取“com.pdf.template”包下对应的模板文件信息,并形成PdfStamper对象,进而获取AcroFields对象。
步骤4:解析模板标记获得每一个标记的替换变量信息把对应变量数据进行填充,并把PDF暂存到服务器端,将PDF提供对外输出。
根据读取到的PDF模板进行解析,获得每个标记的数据变量名称,并根据接口调用方提供的数据进行匹配对应输出,最后将生成的PDF数据存储到服务器端,并以输出流的方式向客户端输出提供客户保存。
通过以上步骤获得的AcroFields对象获取模板中获得每个标记的元素信息,通过循环业务传Map,找到Map中key值对应的标记元素中name属性,把该key对应的value值赋予标记元素中的value值,再把放到AcroFields 域中,最后将生成的PDF文件以模板号和时间戳组合命名存储到服务器端“com.pdf.produce”包下,并以输出二进制流的方式向客户端输出提供客户保存。
本发明可有效提高项目开发效率、提高易用性、降低公司其他项目开发成本。
上述具体实施方式仅是本发明的具体个案,本发明的专利保护范围包括但不限于上述具体实施方式,任何符合本发明的一种数据导出为PDF的方法的权利要求书的且任何所属技术领域的普通技术人员对其所做的适当变化或替换,皆应落入本发明的专利保护范围。