SSM框架下根据模板导出pdf

java根据模板导出pdf


准备
先做自己想用的pdf模板。
1、新建word文档,另存为pdf

pdf
2、使用工具创建pdf表单
pdf表单

黑框中的为后面代码中要用到的"key"值。
完成后保存即可

主体
1、pom.xml

<!-- 生成pdf -->
<dependency>
	<groupId>com.itextpdf</groupId>
	<artifactId>itextpdf</artifactId>
	<version>5.4.3</version>
</dependency>

2、工具类

public class PdfExport {
	// 利用模板生成pdf
	public static void pdfout(Map<String, Object> o,HttpServletResponse response) {
		// 模板路径
		String templatePath = "F:/test2.pdf";
//		String templatePath = "/project/data/pdf/pdfModal.pdf";

		PdfReader reader;
		OutputStream out;
		ByteArrayOutputStream bos;
		PdfStamper stamper;
		try {
			//字体设置没用,但好像又有用。有用的话最好,没用的话试试“最后”的“1”
//			BaseFont bf = BaseFont.createFont("F:/华文新魏.TTF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
			
            out = response.getOutputStream();// 输出流
            reader = new PdfReader(templatePath);// 读取pdf模板  
            bos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, bos);
            AcroFields form = stamper.getAcroFields();
            //文字类的内容处理
            Map<String,String> datemap = (Map<String,String>)o.get("datemap");
//          form.addSubstitutionFont(bf);//字体
            for(String key : datemap.keySet()){
                String value = datemap.get(key);
                form.setField(key,value);
            }
            //图片类的内容处理
            Map<String,String> imgmap = (Map<String,String>)o.get("imgmap");
            for(String key : imgmap.keySet()) {
                String value = imgmap.get(key);
                String imgpath = value;
                int pageNo = form.getFieldPositions(key).get(0).page;
                Rectangle signRect = form.getFieldPositions(key).get(0).position;
                float x = signRect.getLeft();
                float y = signRect.getBottom();
                //根据路径读取图片
                Image image = Image.getInstance(imgpath);
                //获取图片页面
                PdfContentByte under = stamper.getOverContent(pageNo);
                //图片大小自适应
                image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                //添加图片
                image.setAbsolutePosition(x, y);
                under.addImage(image);
            }
            stamper.setFormFlattening(true);// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
            stamper.close();
            Document doc = new Document();

            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
            copy.addPage(importPage);
            doc.close();
			out.flush();
			out.close();

        } catch (IOException e) {
            System.out.println(e);
        } catch (DocumentException e) {
            System.out.println(e);
        }

	}
}

3、调用

@Controller
@RequestMapping("/zinPdf")
public class ZinPdfController{
	@RequestMapping(value = "/pdf", produces = "application/json; charset=utf-8")
	@ResponseBody
	public Map<String, Object> selectApplyHorseRegByApplyTypeStatus(Map<String, Object> o, HttpServletResponse response) {
		Map<String, Object> resultMap = new HashMap<String, Object>();
		try {
			/***************************************主要是这里的东西*******************/
			Map<String, Object> map = new HashMap<String, Object>();
			
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
			// 获取String类型的时间
			String date = sdf.format(new Date());

			map.put("date", date);// date
			map.put("weather", "晴");
			map.put("todayF", "阳光明媚");
			
			//图片
			Map<String, Object> map2 = new HashMap<String, Object>();
			map2.put("img", "f:/1.jpg");// 

			o.put("datemap", map);
			o.put("imgmap", map2);
			PdfExport.pdfout(o, response);
			/***********************************************************************/
			resultMap = ResponseData.success();

		} catch (Exception e) {
			resultMap = ResponseData.error("出现异常");
		}

		return resultMap;
	}
}

4、结果
结果
最后
1、文字域的字体字号等,是在准备阶段的第2步(创建pdf表单)时设置的。 如果是利用 AcroFields填充值的不需要在程序中设置字体,在模板文件中设置字体为中文字体就行了
2、注意模板路径
3、参考

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值