itextpdf处理PDF,用文本域的方式

注意字体要用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);
		}
	}
}

 

以下是Java itextpdf设置pdf文本域行间距的示例代码: ```java import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Font; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.AcroFields; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import java.io.FileOutputStream; import java.io.IOException; public class SetTextFieldLineSpacing { public static void main(String[] args) throws IOException, DocumentException { // 读取pdf模板文件 PdfReader reader = new PdfReader("template.pdf"); // 创建输出流 FileOutputStream out = new FileOutputStream("output.pdf"); // 创建pdf文档对象 Document document = new Document(); // 创建pdf写入器 PdfStamper stamper = new PdfStamper(reader, out); // 获取pdf表单 AcroFields form = stamper.getAcroFields(); // 设置字体 BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font f = new Font(font, 12); // 设置文本域内容 form.setField("text_field", "这是一段测试文本,\n第二行,\n第三行。"); // 设置文本域字体 form.setFieldProperty("text_field", "textfont", font, null); // 设置文本域字体大小 form.setFieldProperty("text_field", "textsize", 12f, null); // 设置文本域字体颜色 form.setFieldProperty("text_field", "textcolor", new java.awt.Color(0, 0, 0), null); // 设置文本域行间距 form.setFieldProperty("text_field", "leading", 20f, null); // 关闭pdf写入器 stamper.close(); // 关闭输出流 out.close(); // 关闭pdf模板文件 reader.close(); } } ``` 在上述代码,我们使用了`setFieldProperty()`方法来设置文本域的行间距,其`"leading"`参数用于设置行间距的大小,单位为磅(pt)。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值