注意字体要用windows的字体,pdf用软件设置文本域
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.1</version>
</dependency>
@ApiOperation(value = "导出 PDF简历")
@GetMapping("exportServantpdf") //
public Object selectMatchIng(HttpServletResponse response, Long servantId) throws UnsupportedEncodingException {
// 指定解析器
System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
Servant servant = servantService.selectByPrimaryKey(servantId);
if (null == servant) {
return null;
}
String filename = servant.getServantName().substring(0, 1) + "阿姨.pdf";
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(filename, "UTF-8"));
OutputStream os = null;
PdfStamper ps = null;
PdfReader reader = null;
try {
// 2 读入pdf模板
ClassPathResource resource = new ClassPathResource("pdf/jianli.pdf");
InputStream inputStream = resource.getInputStream();
reader = new PdfReader(inputStream);
// 3 根据表单生成一个新的pdf
os = response.getOutputStream();
ps = new PdfStamper(reader, os);
// 4 获取pdf表单
AcroFields form = ps.getAcroFields();
// 5给表单添加中文字体 这里采用系统字体。不设置的话,中文可能无法显示
String fontPath = ClassPathResource.class.getClassLoader().getResource("pdf/simsun.ttc").toString();
BaseFont bf = BaseFont.createFont(fontPath + ",1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
form.addSubstitutionFont(bf);
// 简历PDF文件信息填充
serevantPdfCompent.fillServantPdf(servantId, servant, ps, form);
ps.setFormFlattening(true);// 关闭填充
// -------------------------------------------------------------
System.out.println("===============PDF导出成功=============");
} catch (Exception e) {
System.out.println("===============PDF导出失败=============");
e.printStackTrace();
} finally {
try {
ps.close();
reader.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
package com.jzlife.nurse.compent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.List;
import javax.imageio.ImageIO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfStamper;
/**
* PDF填充
* @author lurunzhen
*
*/
@Component
public class ServantPdfCompent {
@Autowired
ServantService servantService;
@Autowired
FileStorageCompent fileStorageCompent;
@Autowired
ServantStateService servantStateService;
@Autowired
AppraisalItemService appraisalItemService;
public void fillServantPdf(Long servantId, Servant servant, PdfStamper ps, AcroFields form)
throws IOException, DocumentException, BadElementException, MalformedURLException {
//基础信息
ServantInfo servantInfo = servantService.selectServantInfoById(servantId);
form.setField("bianhao",servant.getServantNo());
form.setField("xingming",servant.getServantName().substring(0,1)+"阿姨");
form.setField("jingyan",servantInfo.getWorkExperience());
form.setField("nianling",IdCard.getAgeByIdCard(servantInfo.getIdCard())+"");
form.setField("jiguan",servantInfo.getNativePlace());
form.setField("mingzu",servantInfo.getNation());
form.setField("xueli",servantInfo.getEducation());
form.setField("shuxiang",servantInfo.getZodiac());
form.setField("putonghua",servantInfo.getMandarin());
//头像
try {
headImage(servant, ps, form);
} catch (Exception e) {
e.printStackTrace();
}
//服务模式
try {
serviceModel(servantId, ps, form);
} catch (Exception e) {
e.printStackTrace();
}
//背调,体检
try {
investigation(servantId, ps, form);
} catch (Exception e) {
e.printStackTrace();
}
//工作经历
List<ServantResume> resumeList = servantService.selectResumeByServantId(servantId);
if(null!=resumeList&&resumeList.size()>0) {
String str="";
for(ServantResume re:resumeList) {
String st=DateUtil.dateToString(re.getStartTime(), "yyyy.M");
String ed=DateUtil.dateToString(re.getEndTime(), "yyyy.M");
String content=re.getContent();
String line=st+"-"+ed+" "+content+"\n";
str=str+line;
}
form.setField("gongzuojingli",str);
}
//技能和分数条,认证的技能
try {
skillAndScoreLine(servantId, ps, form);
} catch (Exception e) {
e.printStackTrace();
}
//其他技能(标签)
List<ServantLabel> servantLabel = servantService.selectServantLabelByservantId(servantId);
if(null!=servantLabel&&servantLabel.size()>0) {
String str="";
for(ServantLabel s:servantLabel) {
str=str+"【"+s.getLabelName()+"】 ";
}
form.setField("qitajineng",str);
}
}
/**
* //背调合格,体检合格,用图片代替
* @param servantId
* @param ps
* @param form
* @throws BadElementException
* @throws MalformedURLException
* @throws IOException
* @throws DocumentException
*/
private void investigation(Long servantId, PdfStamper ps, AcroFields form)
throws BadElementException, MalformedURLException, IOException, DocumentException {
List<ServantBatch> selectIsPass = appraisalItemService.selectIsPass(servantId);
ServantState servantState = servantStateService.selectByServantId(servantId);
// 获取域起始坐标位置
int renzheng = form.getFieldPositions("renzheng").get(0).page;//如果页数固定可填数字
Rectangle signRect = form.getFieldPositions("renzheng").get(0).position;
PdfContentByte pdfbyte = ps.getOverContent(renzheng);//第1页 //如果页数固定可填数字
float x = signRect.getLeft();
float y = signRect.getBottom();
if(null==selectIsPass||selectIsPass.size()==0) {//为空时,背调通过
String imgPath = ClassPathResource.class.getClassLoader().getResource("pdf/rz_beidiao.png").toString();
Image image =Image.getInstance(imgPath);
image.scaleToFit(image.getWidth(), image.getHeight()); //图片对称
image.setAbsolutePosition(x, y);
x=x+160;
pdfbyte.addImage(image);
}
if(null!=servantState&&servantState.getInspectState().equals(1)) {//体检通过
String imgPath = ClassPathResource.class.getClassLoader().getResource("pdf/rz_tijian.png").toString();
Image image =Image.getInstance(imgPath);
image.scaleToFit(image.getWidth(), image.getHeight()); //图片对称
image.setAbsolutePosition(x, y);
x=x+160;
pdfbyte.addImage(image);
}
}
private void serviceModel(Long servantId, PdfStamper ps, AcroFields form)
throws BadElementException, MalformedURLException, IOException, DocumentException {
//1钟点工保姆 2白班保姆 3住家保姆,4月嫂 图片代替
List<ServantSer> servantser = servantService.selectServantServiceById(servantId);
if(null!=servantser&&servantser.size()>0) {
ServantSer svs=servantser.get(0);
if(null==svs.getServicePattern()) {
return;
}
String [] ms=svs.getServicePattern().split(",");
// 获取域起始坐标位置
int fuwumoshi = form.getFieldPositions("fuwumoshi").get(0).page;//如果页数固定可填数字
Rectangle signRect = form.getFieldPositions("fuwumoshi").get(0).position;
PdfContentByte pdfbyte = ps.getOverContent(fuwumoshi);//第1页 //如果页数固定可填数字
float x = signRect.getLeft();
float y = signRect.getBottom();
for(String s:ms) {
//画长条图
String imgPath = ClassPathResource.class.getClassLoader().getResource("pdf/ms_"+s+".png").toString();
Image image =Image.getInstance(imgPath);
image.scaleToFit(image.getWidth(), image.getHeight()); //图片对称
image.setAbsolutePosition(x, y);
x=x+100;
pdfbyte.addImage(image);
}
}
}
/**
* 头像图片
* @param servant
* @param ps
* @param form
* @throws BadElementException
* @throws MalformedURLException
* @throws IOException
* @throws DocumentException
*/
private void headImage(Servant servant, PdfStamper ps, AcroFields form)
throws BadElementException, MalformedURLException, IOException, DocumentException {
FileStorage fileimage = fileStorageCompent.selectByPrimaryKey(servant.getBustUrlId());
try {
if(null!=fileimage) {
BufferedImage originalImage = ImageIO.read(new File(fileimage.getFileFullPath()+"/"+fileimage.getFileName()));
int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB: originalImage.getType();
BufferedImage resizeImagePng = ImagePixelConvert.resizeImageWithHint2(originalImage, type);
File nf=new File(fileimage.getFileFullPath()+"/"+"pdf_"+fileimage.getFileName());
ImageIO.write(resizeImagePng, "png", nf);//重新等比压缩图片
Image image = Image.getInstance(nf.getPath());
// Image image = Image.getInstance("D:\\tou.jpg");
// image.scaleToFit(195, 220); //图片对称 无效
int touxiang = form.getFieldPositions("touxiang").get(0).page;//如果页数固定可填数字
Rectangle signRect = form.getFieldPositions("touxiang").get(0).position;
PdfContentByte under = ps.getOverContent(touxiang);
float x = signRect.getLeft();
float y = signRect.getBottom();
image.setAbsolutePosition(x, y);
under.addImage(image);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 技能和分数条
* @param servantId
* @param ps
* @param form
* @throws BadElementException
* @throws IOException
* @throws DocumentException
*/
private void skillAndScoreLine(Long servantId, PdfStamper ps, AcroFields form)
throws BadElementException, IOException, DocumentException {
List<ServantAppraisalState> appraisalState = servantService.selectByServantId(servantId);
if(null!=appraisalState&&appraisalState.size()>0) {
// 获取域起始坐标位置
int jinengtiaoPage = form.getFieldPositions("jinengtiao").get(0).page;//如果页数固定可填数字
Rectangle signRect = form.getFieldPositions("jinengtiao").get(0).position;
PdfContentByte pdfbyte = ps.getOverContent(jinengtiaoPage);//第1页 //如果页数固定可填数字
float x = signRect.getLeft();
float y = signRect.getTop();
String str="";
for(ServantAppraisalState s:appraisalState) {
if(s.getState().equals(1)) {//有效
str=str+"【"+s.getItemName()+"】 "+s.getItemLevel()+"分\n";
//画长条图
BufferedImage bfimage = ImagePixelConvert.createBufferedImage(30*Integer.parseInt(s.getItemLevel()), 18);//30*10分,20
Image image =Image.getInstance(bfimage,null);
//Y轴递减减,页面显示下移动
y=y-22;//20是字体大小
image.setAbsolutePosition(x, y);
y=y-4;
pdfbyte.addImage(image);
}
}
form.setField("jineng",str);
}
}
}