1、 制作合同模板
1、 制作模板可以直接利用一款软件(Adobe Acrobat DC),可以在网上找免费破解版的,如果没有找到合适的版本,可以去我的百度云盘下载,地址:链接: http://pan.baidu.com/s/1c3qYj8 密码: xewr,软件安装这里就不说了。
2、 打开Adobe Acrobat DC,选择工具—准备表单
3、 选择文件—开始 ,然后进入模板制作界面。
4、 在需要填入内容处,填入对应的字段,如name,idCard…等,关于填字段的一些常用方法技巧,可参考附件2- Adobe Acrobat DC字段填入方法。模板制作完成后,就可以进入代码开发了
2.2、 jar包准备
选择 iTextAsian.jar和itext-2.1.7.jar
3.control代码
/**
* 根据合同id获取合同信息并生产合同
* @param model
* @param contractId
* @return
*/
@RequestMapping(value="/exportPDF/{contractId}")
public String contractPrintPreview(Model model,@PathVariable("contractId")String contractId,HttpServletResponse response,HttpServletRequest request){
// System.out.println("contractId: " + contractId);
try {
ContractAndRelatedInfoDto contractAndRelatedInfoDto = contractManagementService.queryContractAndRelatedInfoByContractId(contractId);
Map<String,String> data = new HashMap<String,String>();
// 开始时间
data.put("EFFECTIVE_TIME", contractAndRelatedInfoDto.getContractInfoDto().getEffectiveDate());
// 截止时间
data.put("END_TIME", contractAndRelatedInfoDto.getContractInfoDto().getEndDate());
// 有效期
String periodTime = contractAndRelatedInfoDto.getContractInfoDto().getPeriodOfValidity();
String[] periodArr = periodTime.split("\\u002B");
if(periodArr.length > 1){
int total = 0;
for(int i = 0; i < periodArr.length; i++){
String str = periodArr[i];
str = str.substring(0, str.length()-2);
total += Integer.valueOf(str);
}
periodTime = String.valueOf(total);
}else{
periodTime = periodTime.substring(0, periodTime.length()-2);
}
data.put("PERIOD_OF_VALIDITY", periodTime);
// 总课时数
data.put("TOTAL_COURSE_NUM", contractAndRelatedInfoDto.getContractInfoDto().getCourseNum());
// 课程金额
data.put("TOTAL_COURSE_PRICE", contractAndRelatedInfoDto.getContractInfoDto().getCourseAmount());
// 所属中心名
data.put("C_ID", contractAndRelatedInfoDto.getContractInfoDto().getCenterName());
data.put("Signature", contractAndRelatedInfoDto.getContractInfoDto().getContractId());
// System.out.println("Signature: " + contractAndRelatedInfoDto.getContractInfoDto().getContractId());
// 数据
model.addAttribute(PdfStamperView.DATA, data);
// 文件名称
model.addAttribute(PdfStamperView.FILENAME, "学员培训协议_" + contractAndRelatedInfoDto.getContractInfoDto().getContractId() + ".pdf");
//同时生成一条打印记录
savePrintRecord(contractAndRelatedInfoDto.getContractInfoDto().getContractCode());
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
return "contract";
}
4.spring mvc的代码 id对应 contract
<!-- 按照BeanName解析视图 优先使用此视图解析,避免先被解析为JSP -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="1" />
</bean>
<!-- 定义Pdf模版视图 -->
<bean id="contract" class="com.gymboree.cos.fin.contract.info.view.PdfStamperView">
<property name="url" value="/WEB-INF/template/contract_template.pdf" />
</bean>
5. class对应PdfStamperView类 实现AbstractPdfStamperView
package com.gymboree.cos.fin.contract.info.view;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.view.document.AbstractPdfStamperView;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.AcroFields;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfStamper;
/**
* 打印PDF的view
* @author Administrator
*
*/
public class PdfStamperView extends AbstractPdfStamperView {
public static final String DATA = "data";
public static final String FILENAME = "mergePdfFileName";
@Override
protected void mergePdfDocument(Map<String, Object> model,
PdfStamper stamper, HttpServletRequest request,
HttpServletResponse response) throws Exception {
// 设置文件已附件形式下载
// response.setHeader("Content-Disposition", "attachment;filename=" + new String(model.get(FILENAME).toString().replaceAll(" ", "").getBytes("UTF-8"), "ISO8859-1"));
// 获取pdf模板上设置的变量
AcroFields fields = stamper.getAcroFields();
// 使用本机自带字体
// BaseFont bf = BaseFont.createFont("/SIMYOU.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
BaseFont bf = BaseFont.createFont("C:/WINDOWS/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
//BaseFont bf = BaseFont.createFont("/usr/share/fonts/TTF/SIMYOU.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
ArrayList<BaseFont> arrayList = new ArrayList<BaseFont>();
arrayList.add(bf);
// 设置模板上字体的格式
fields.setSubstitutionFonts(arrayList);
// 填充模板上数据
fillData(fields, (Map<String, String>) model.get(DATA));
// System.out.println(((Map<String, String>) model.get(DATA)).get("Signature"));
// 设置文本域是否可以编辑 true:不可以编辑
stamper.setFormFlattening(true);
}
private void fillData(AcroFields fields, Map<String, String> data)
throws IOException, DocumentException {
for (String key : data.keySet()) {
String value = data.get(key);
fields.setField(key, value);
}
}
}
出现的界面即是在线预览模式