当前位置:Java -> 一个解决企业开发痛点的PDF框架
Nanhu-print-java是一个用Java语言实现的PDF生成框架。
用户可以准备JSON格式的业务数据和XML格式的配置文件,然后调用nanhu-print-java框架API来完成生成PDF文件的过程。
Nanhu-print-java的GitHub地址可以在这里找到。
这里有一个开发视频。
我所在的公司想要实现自定义打印功能,需要满足以下功能:
公司在开始阶段准备了两种技术方案:
值得考虑的是,页面上每个字段都要做复杂的显示和隐藏操作,而直接通过Java开发接口进行界面显示是非常麻烦的。开发完成后,需求变更、字段增减都要涉及程序修改,代码维护难度较大。因此,第一种方案被否定。
因此,公司选择了第二种方案,使用JS在前端生成HTML,然后发送到后端进行HTML转PDF。
在实施过程中,遇到了难以解决的问题:
首先,南湖打印-Java是一个PDF打印框架,定义了自己的XML模型格式文件。当用户编写XML格式文件时,需要遵循XSD文件的元素定义。
如上图所示,在使用南湖打印-Java时,用户需要准备XML模型文件和要打印的业务数据,然后调用南湖打印-Java的框架API完成生成PDF文件的过程。
示例代码如下:
在企业应用程序中,账单打印是一个常见的功能。通常需要在页面顶部显示标题和公司名称,并在页面底部显示表格金额、日期、公司签名和其他信息的摘要。
如果文档中的表格信息比较长且有多页,通常需要每页都在顶部显示表头行信息。
使用南湖打印Java框架,用户可以通过配置方便快捷地完成这些功能。
简化的配置内容如下:
<body>
<params>
<param name="extendToFillBody" value="default"></param>
</params>
<table>
<thead showPosition="firstPage">
BillTitle,,,,,,
</thead>
<thead showPosition="everyPage">
table head content,,,,,,
</thead>
<tbody>
table body content,,,,,,
</tbody>
<tloop>
last page fill content,,,,,,
</tloop>
<tbottom>
last page bottom content,,,,,,
</tbottom>
</table>
</body>
对于多页文档,有必要在表头显示页码,也可能需要在表尾显示页码。
用户可以使用以下配置方法,在页面的任意位置实现与页码相关的信息。
<div>
<params>
<param name="customContent" value="com.hongjinqiu.nanhuprint.eval.custom.CustomPageNumber" />
<param name="customContentFormat" value="{currentPageNumber} of {totalPageNumber}" />
</params>
</div>
对于快递订单等文档,在开发PDF打印模板时,需要使用图片作为背景。当用户使用南湖打印Java开发这种类型的版本时,可以设置背景图片,然后调整文本的填充值:
<div backgroundSize="contain" width="100px" height="420px">
<css>
<backgroundImage js="url('http://xxxx.png')" />
</css>
<div paddingLeft="10px" paddingTop="24px"><span value="InvoiceCode" /></div>
</div>
南湖打印Java框架支持通过配置实现文本水印或图片水印。
配置如下:
<div fontWeight="bold" paddingTop="10">
<params>
<param name="waterMark" value="default" />
<param name="waterMarkOpacity" value="0.9" />
<param name="waterMarkOffsetX" value="-150" />
<param name="waterMarkOffsetY" value="0" />
<param name="waterMarkImage" value="http://localhost:8891/images/camel.png" />
<param name="waterMarkImageWidth" value="200" />
<param name="waterMarkImageHeight" value="78" />
<param name="waterMarkRotation" value="45" />
<param name="waterMarkLayer" value="default" />
</params>
</div>
<div>
<params>
<param name="waterMark" value="default" />
<param name="waterMarkText" value="I am waterMarkText" />
<param name="waterMarkOpacity" value="0.5" />
<param name="waterMarkTextFontSize" value="24" />
<param name="waterMarkOffsetX" value="0" />
<param name="waterMarkOffsetY" value="100" />
<param name="waterMarkRotation" value="45" />
<param name="waterMarkLayer" value="under" />
</params>
</div>
如果有一个长表格,需要为每一行显示不同的背景颜色,可以通过配置轻松实现。
配置示例如下:
<forEach var="item" itemsJs="data.contentList" varStatus="index">
<set valueJs="'white'" var="loopBgColor" />
<if testJs="index %2 == 0">
<set valueJs="'orange'" var="loopBgColor" />
</if>
<tr fontFamily="abc" backgroundColor="js:loopBgColor">
<td width="100%">
<div paddingTop="20">
<span value="js:item"/>
</div>
</td>
</tr>
</forEach>
南湖打印Java框架支持动态标签:if、forEach、macroRef、set、Macro。
配置示例如下:
<if testJs="index %2 == 0"></if>
<forEach var="item" itemsJs="data.contentList" varStatus="index"></forEach>
如果页面上有重复的代码显示块,可以将重复的代码显示块放入宏标签中,然后在其他位置引用它们。
定义宏代码块:
<macro name="addressBillingMacro">
<div cls="f12">
<span value="wwww"/>
</div>
</macro>
引用宏代码块:
<macroRef name="addressBillingMacro"/>
在文档打印中,有时单元格宽度是固定的,但单元格内容太长,可以通过scaleToFitContentByPdf
参数进行配置,轻松实现内容缩放。
配置示例:
<div width="20px" scaleToFitContentByPdf="true">
<span value="RMB 999,999,999.99" />
</div>
如果希望文字不会缩小或换行,而是希望单元格宽度随内容改变,可以进行如下配置:
<td textAlign="left">
<params>
<param name="calcWidth" value="com.hongjinqiu.nanhuprint.eval.custom.CalcWidth" />
<param name="calcWidthTagId" value="leftIssueBy" />
</params>
<div id="leftIssueBy" cls="f13 bodyLineHeight" whiteSpace="nowrap" paddingRight="5px" >
<span value="ISSUED BY:" />
</div>
</td>
数量、单价、金额等字段通常需要进行格式化和显示。
用户可以通过应用程序来格式化这些字段的值传递给框架。
这些字段的格式化也可以通过框架提供的配置来实现:
<span value="js:item.item_price" format="num"/>
<span value="js:item.item_price" format="unitPrice"/>
<span value="js:item.item_price" format="amt"/>
推荐阅读: 远程办公会是未来的趋势吗
本文链接: 一个解决企业开发痛点的PDF框架