package com.ruoyi.service.impl;
|
|
import cn.hutool.extra.qrcode.QrCodeUtil;
|
import cn.hutool.extra.qrcode.QrConfig;
|
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
|
import com.itextpdf.text.*;
|
import com.itextpdf.text.Font;
|
import com.itextpdf.text.Image;
|
import com.itextpdf.text.Rectangle;
|
import com.itextpdf.text.pdf.BaseFont;
|
import com.itextpdf.text.pdf.PdfPCell;
|
import com.itextpdf.text.pdf.PdfPTable;
|
import com.itextpdf.text.pdf.PdfWriter;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import javax.imageio.ImageIO;
|
import java.awt.*;
|
import java.awt.image.BufferedImage;
|
import java.io.*;
|
|
@Service
|
public class pdfGenerateService {
|
@Autowired
|
private BarcodeService barcodeService;
|
//生产二维码
|
public byte[] createQrCodeN(String content, int width, int height) throws IOException {
|
QrConfig config = new QrConfig(width, height);
|
|
config.setMargin(3);
|
// 高纠错级别
|
config.setErrorCorrection(ErrorCorrectionLevel.H);
|
// 设置前景色,既二维码颜色(自行选择颜色修改)
|
config.setForeColor(new Color(11, 11, 11).getRGB());
|
// 设置背景色(灰色)需要背景色时候打开链接
|
config.setBackColor(new Color(242,242,242).getRGB());
|
|
|
BufferedImage bufferedImage = QrCodeUtil.generate(//
|
content, //二维码内容
|
config
|
);
|
System.out.println(bufferedImage);
|
System.out.println("---02340230949394");
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
ImageIO.write(bufferedImage, "jpg", os);
|
|
|
// ImageIO.write(bufferedImage, "jpg", new File("outputImage.jpg"));
|
|
return os.toByteArray();
|
}
|
|
|
public void generatePdf(String pdfPath) throws IOException, DocumentException {
|
|
Document document = new Document();
|
PdfWriter.getInstance(document, new FileOutputStream(pdfPath));
|
document.open();
|
|
String [] tits = {"档 号:","档案馆(室)号:","缩 微 号: ","发 文 号:",
|
"案 卷 题 名:","编 制 日 期:","编 制 单 位:","保 管 期 限:","密 级:"};
|
String [] cons = {"D3.4.1-05-2024-0002","","","穗规划资源建证〔2024〕2033号","广州市自来水有限公司白云区江高镇江高镇政府西侧、江府路北侧白云区江高镇江高镇政府西侧、江府路北侧新装供水管工程","2024-04-23","广州市规划和自然资源局白云区分局","永久",""};
|
|
//把图片加入到pdf当中
|
Image img = Image.getInstance(createQrCodeN(cons[0], 80, 80));
|
// 设置图片在PDF中的位置(可选)
|
// img.setAbsolutePosition(100, 100);
|
// 将图片添加到PDF文档中
|
PdfPCell pdfPCell = new PdfPCell(img);
|
pdfPCell.setBorder(Rectangle.NO_BORDER); // 移除单元格边框
|
|
pdfPCell.setMinimumHeight(80);
|
pdfPCell.setUseAscender(true); // 设置可以居中
|
pdfPCell.setHorizontalAlignment(PdfPCell.ALIGN_RIGHT); // 设置水平居中
|
pdfPCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); // 设置垂直居中
|
pdfPCell.setColspan(2);
|
pdfPCell.setPaddingBottom(30);
|
|
// 创建表格并设置列宽比例
|
float[] columnWidths = {35f, 65f}; // 第一列30%,第二列70%
|
PdfPTable table = new PdfPTable(columnWidths);
|
// PdfPTable table = new PdfPTable(2);
|
table.setWidthPercentage(80); // 增大表格宽度百分比
|
table.setHorizontalAlignment(Element.ALIGN_LEFT); // 设置表格整体居中
|
table.setSpacingBefore(30f); // 设置表格前间距
|
table.setSpacingAfter(90f); // 设置表格后间距
|
|
|
// PdfPTable table1 = new PdfPTable(1);
|
// table1.setWidthPercentage(90); // 增大表格宽度百分比
|
// table1.setHorizontalAlignment(Element.ALIGN_LEFT); // 设置表格整体居中
|
// table1.setSpacingBefore(10f); // 设置表格前间距
|
// table1.setSpacingAfter(10f); // 设置表格后间距
|
table.addCell(pdfPCell);
|
// document.add(table1);
|
// 设置中文字体
|
|
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
|
Font chineseFont = new Font(bfChinese, 16, Font.BOLD);
|
Font chineseFont1 = new Font(bfChinese, 10, Font.BOLD);
|
|
// 添加档号
|
// 添加带下划线的档号
|
|
|
|
for(int i = 0; i < tits.length; i++) {
|
// 使用PdfPTable实现精确对齐
|
|
// 第一行:档号
|
PdfPCell labelCell1 = new PdfPCell(new Phrase(tits[i], chineseFont));
|
labelCell1.setHorizontalAlignment(Element.ALIGN_RIGHT); // 设置右对齐
|
|
labelCell1.setBorder(Rectangle.NO_BORDER);
|
// PdfPCell valueCell1 = new PdfPCell(new Phrase(cons[i], chineseFont));
|
// valueCell1.setBorder(Rectangle.NO_BORDER);
|
labelCell1.setMinimumHeight(30);
|
labelCell1.setPaddingTop(10f); // 上内边距10单位
|
labelCell1.setPaddingBottom(10f); // 下内边距10单位
|
labelCell1.setPaddingLeft(15f); // 左内边距15单位
|
labelCell1.setPaddingRight(15f); // 右内边距15单位
|
|
|
PdfPCell valueCell1 = new PdfPCell(new Phrase(cons[i], chineseFont));
|
valueCell1.setBorder(Rectangle.NO_BORDER);
|
valueCell1.setUseBorderPadding(true);
|
valueCell1.setBorderWidthBottom(0.5f); // 设置底部边框作为下划线
|
valueCell1.setMinimumHeight(30);
|
valueCell1.setPaddingTop(10f); // 上内边距10单位
|
valueCell1.setPaddingBottom(10f); // 下内边距10单位
|
valueCell1.setPaddingLeft(15f); // 左内边距15单位
|
valueCell1.setPaddingRight(15f); // 右内边距15单位
|
table.addCell(labelCell1);
|
table.addCell(valueCell1);
|
|
if(i==3)
|
{
|
//增加那个条形码
|
byte [] bas = barcodeService.generateBarcodeImage(cons[0]);
|
|
Image img1= Image.getInstance(bas);
|
|
PdfPCell pdfPCell1 = new PdfPCell(img1);
|
pdfPCell1.setBorder(Rectangle.NO_BORDER); // 移除单元格边框
|
|
pdfPCell1.setMinimumHeight(40);
|
pdfPCell1.setUseAscender(true); // 设置可以居中
|
pdfPCell1.setHorizontalAlignment(PdfPCell.ALIGN_RIGHT); // 设置水平居中
|
pdfPCell1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); // 设置垂直居中
|
pdfPCell1.setColspan(2);
|
pdfPCell1.setPaddingBottom(20);
|
pdfPCell1.setPaddingTop(20);
|
table.addCell(pdfPCell1);
|
}
|
|
|
}
|
document.add(table); // 空行
|
|
// 关闭文档
|
document.close();
|
}
|
}
|