package com.boss.fiscal.report.utils; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Image; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.*; import org.apache.commons.lang.StringUtils; import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class PDFUtils { /** * 拿到数据直接转换输出pdf * @param data * @return */ public Map dataPdf(Map<String, String> data) { Map<String, Object> result = new HashMap<>(); try { String path = data.get("path"); String fileName = data.get("fileName"); if (StringUtils.isEmpty(path)) { path = "D:/fiscal/"; File file = new File(path); if (!file.exists()) {// 判断目录是否存在 file.mkdir(); } path = "D:/fiscal/" + fileName + "/"; file = new File(path); if (!file.exists()) {// 判断目录是否存在 file.mkdir(); } } if (StringUtils.isEmpty(fileName)) { throw new RuntimeException("fileName 不可为空"); } //读取pdf PdfReader reader = new PdfReader(path + fileName); ByteArrayOutputStream bos = new ByteArrayOutputStream(); //将要生成的目标PDF文件名称 PdfStamper ps = new PdfStamper(reader, bos); //PdfContentByte under = ps.getUnderContent(1); //设置中文字体 BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); ArrayList<BaseFont> fontList = new ArrayList<BaseFont>(); fontList.add(bf); //取出报表模板中的所有字段 AcroFields fields = ps.getAcroFields(); fields.setSubstitutionFonts(fontList); //对表单数据进行赋值 fillData(fields, ps, data); //必须要调用这个,否则文档不会生成的 ps.setFormFlattening(true); ps.close(); String outPath = data.get("outPath"); OutputStream fos = new FileOutputStream(outPath + fileName); fos.write(bos.toByteArray()); fos.flush(); fos.close(); bos.close(); result.put("code","100000"); result.put("data",outPath+fileName); result.put("result","转化成功"); } catch (Exception e) { result.put("code","118000"); result.put("result","转化失败"); result.put("data",e.getMessage()); } return result; } public void fillData(AcroFields fields, PdfStamper ps, Map<String, String> data) throws IOException, DocumentException { // 为字段赋值,注意字段名称是区分大小写的 for (String key : data.keySet()) { if (key.equals("image")) { /** * 添加图片 */ String imgpath = data.get(key); int pageNo = fields.getFieldPositions(key).get(0).page; Rectangle signRect = fields.getFieldPositions(key).get(0).position; float x = signRect.getLeft(); float y = signRect.getBottom(); // 读图片 Image image = Image.getInstance(imgpath); // 获取操作的页面 PdfContentByte under = ps.getOverContent(pageNo); // 根据域的大小缩放图片 image.scaleToFit(signRect.getWidth(), signRect.getHeight()); // 添加图片 image.setAbsolutePosition(x, y); under.addImage(image); } else { String value = data.get(key); fields.setField(key, value); } } } }
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.1</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency>