效果图
代码实现
1.导入修改pdf的依赖工具类
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.1</version>
</dependency>
2.导入生成二维码的依赖工具类
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
3.生成二维码的实现方法
/**
* 生成二维码(条码)图片
*
* @param content 文本
* @param codeImgFileSaveDir 文件
* @param fileName 文件名
* @param codeFormat 编码格式 CODE_39:条码,QR_CODE:二维码
* @param whdth 宽度
* @param height 高度
*/
public static File createCodeToFile(String content, File codeImgFileSaveDir, String fileName, String codeFormat, int whdth, int height) throws Exception {
try {
content = content.trim();
if (codeImgFileSaveDir == null || codeImgFileSaveDir.isFile()) {
//二维码图片存在目录为空,默认放在桌面...
codeImgFileSaveDir = FileSystemView.getFileSystemView().getHomeDirectory();
}
if (!codeImgFileSaveDir.exists()) {
//二维码图片存在目录不存在,开始创建...
codeImgFileSaveDir.mkdirs();
}
BufferedImage bufferedImage;
if (codeFormat == "CODE_39") {
//核心代码-生成二维码
bufferedImage = QrCodeUtil.generate(content, BarcodeFormat.CODE_39, whdth, height);
} else {
bufferedImage = QrCodeUtil.generate(content, BarcodeFormat.QR_CODE, whdth, height);
}
File codeImgFile = new File(codeImgFileSaveDir, fileName);
log.info("二维码图片生成成功:" + codeImgFile.getPath());
ImageIO.write(bufferedImage, "png", codeImgFile);
return codeImgFile;
} catch (Exception e) {
log.error("二维码图片生成失败", e);
throw new Exception(e);
}
}
4.将生成的二维码插入PDF的实现方法
/**
* 在pdf中插入图片
*
* @param bytes
* @param image
* @throws Exception
*/
public static byte[] insertImage(byte[] bytes, File image) throws Exception {
try {
PDDocument doc = PDDocument.load(bytes);
// PDImageXObject pdImage = PDImageXObject.createFromFile(imagePath, doc);
PDImageXObject pdImage = PDImageXObject.createFromFileByContent(image, doc);
PDPage page = doc.getPage(0);
//注释的这行代码会覆盖原内容,没注释的那行不会覆盖
// PDPageContentStream contentStream = new PDPageContentStream(doc, page);
PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true, true);
contentStream.drawImage(pdImage, 555, 493);
contentStream.close();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
doc.save(baos);
byte[] pdfBytes = baos.toByteArray(); // PDF Bytes
doc.close();
System.out.println("成功插入图片");
return pdfBytes;
// doc.save(outputPDFFile);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
5.前端选中要生成二维码的行信息时,触发点击事件调用生成二维码接口,将二维码路径存入redis
6.点击导出生成PDF的字节码数组,
返回加工插入二维码后的字节码数组,
将pdf字节码上传redis服务器供下载 实现图1效果