最近公司有个需求,需要对执业证和相关证件进行打印,在证件的指定位置输出文字信息,因为在做的时候发现这类资料非常少,然后只能自己研究,整理了一个可行的打印方案,已经在项目中测试通过,应该适合所有需要这类指定位置输出文字打印到证照上
打印方案思路: 使用空白图片模版使用java来定位需要的数据添加到模版图片中生成新图片返回web前端中,使用jquery打印插件jQuery.print.js来进行页面的局部图片打印
示例代码:
/**
* 给jpg添加文字
*
* @param filePath 路径
* @param imgDataList 添加内容
* @param rotate 偏移量
* @param x 偏移量x
* @param y 偏移量y
* @return
*/
public static byte[] createStringMark(URL filePath, List<ImgData> imgDataList, int rotate, int x, int y) {
ImageIcon imgIcon = new ImageIcon(filePath);
Image theImg = imgIcon.getImage();
int width = theImg.getWidth(null) == -1 ? 595 : theImg.getWidth(null);
int height = theImg.getHeight(null) == -1 ? 841 : theImg.getHeight(null);
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = image.createGraphics();
graphics.setColor(Color.black);
graphics.setBackground(Color.black);
graphics.drawImage(theImg, 0, 0, null);
// 设置按照xy坐标旋转90度
graphics.rotate(Math.toRadians(rotate), x, y);
for (ImgData imgData : imgDataList) {
// 字体设置,字体、字型、字号
graphics.setFont(imgData.getFont());
// 画文字
graphics.drawString(imgData.getTextStr(), imgData.getX(), imgData.getY());
}
graphics.dispose();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
ImageIO.write(image, "jpg", outputStream);
} catch (IOException e) {
e.printStackTrace();
}
return outputStream.toByteArray();
}
package com.zjsft.openapi.web.form;
import lombok.Data;
import java.awt.*;
/**
* @author hs
* @Description: {封装jpg需要的参数}
* @date 2019/8/2 13:40
*/
@Data
public class ImgData {
/**
* 图片中添加内容
*/
private String textStr;
/**
* 字体设置,字体、字型、字号
*/
private Font font;
/**
* 坐标
*/
private Integer x;
private Integer y;
}
/**
* 执业证号第一步生成预览图返回图片url给页面
*
* @param orgBaseVo
* @return
*/
@ResponseBody
@RequestMapping("/orgPrintJustNextStep")
public ResultVO orgPrintJustNextStep(Param param) {
List<ImgData> imgDataList = new ArrayList<>();
ImgData imgData = new ImgData();
imgData.setTextStr(param.getLicense());
imgData.setFont(new Font("宋体", Font.BOLD, 24));
imgData.setX(770);
imgData.setY(-382);
imgDataList.add(imgData);
ImgData imgData1 = new ImgData();
imgData1.setTextStr(param.cnName);
imgData1.setFont(new Font("宋体", Font.BOLD, 24));
imgData1.setX(300);
imgData1.setY(-280);
imgDataList.add(imgData1);
ImgData imgData2 = new ImgData();
imgData2.setTextStr(param.getCertificateOrg());
imgData2.setFont(new Font("宋体", Font.BOLD, 24));
imgData2.setX(730);
imgData2.setY(-15);
imgDataList.add(imgData2);
ImgData imgData3 = new ImgData();
imgData3.setTextStr(param.getPrintCertificateData());
imgData3.setFont(new Font("宋体", Font.BOLD, 24));
imgData3.setX(770);
imgData3.setY(30);
imgDataList.add(imgData3);
ImgData imgData4 = new ImgData();
imgData4.setTextStr(param.getPrintCertificateData());
imgData4.setFont(new Font("宋体", Font.BOLD, 24));
imgData4.setX(870);
imgData4.setY(30);
imgDataList.add(imgData4);
ImgData imgData5 = new ImgData();
imgData5.setTextStr(param.getPrintCertificateData());
imgData5.setFont(new Font("宋体", Font.BOLD, 24));
imgData5.setX(950);
imgData5.setY(30);
imgDataList.add(imgData5);
try {
URL url = new URL("https://127.0.0.1:8080/resource/test.jpg");
byte[] bytes = ImageEditUtil.createStringMark(url, imgDataList, 90, 100, 100);
return ImageEditUtil.upload(bytes);
} catch (MalformedURLException e) {
e.printStackTrace();
}
return ResultVO.failure("服务器异常,请稍后再试");
}
返回图片url到页面上就可以使用局部打印调用浏览器的打印功能来进行打印了
jQuery.print('返回图片div的id')