|
|
|
@ -1,5 +1,10 @@
|
|
|
|
|
package com.hw.printer.utils;
|
|
|
|
|
|
|
|
|
|
import com.google.zxing.BarcodeFormat;
|
|
|
|
|
import com.google.zxing.EncodeHintType;
|
|
|
|
|
import com.google.zxing.WriterException;
|
|
|
|
|
import com.google.zxing.common.BitMatrix;
|
|
|
|
|
import com.google.zxing.qrcode.QRCodeWriter;
|
|
|
|
|
import com.hw.common.core.exception.ServiceException;
|
|
|
|
|
import com.hw.printer.api.domain.vo.PrintContentVo;
|
|
|
|
|
import com.itextpdf.text.Document;
|
|
|
|
@ -17,6 +22,7 @@ import org.springframework.stereotype.Component;
|
|
|
|
|
import javax.annotation.PostConstruct;
|
|
|
|
|
import javax.print.PrintService;
|
|
|
|
|
import javax.print.PrintServiceLookup;
|
|
|
|
|
import java.awt.image.BufferedImage;
|
|
|
|
|
import java.awt.print.*;
|
|
|
|
|
import java.io.ByteArrayOutputStream;
|
|
|
|
|
import java.io.File;
|
|
|
|
@ -24,6 +30,7 @@ import java.io.FileOutputStream;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -189,22 +196,53 @@ public class HwPrintUtil {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void setImage(AcroFields form, PdfStamper stamper, String fieldName, String fieldValue) throws DocumentException {
|
|
|
|
|
//获取位置(左上右下)
|
|
|
|
|
private static void setImage(AcroFields form, PdfStamper stamper, String fieldName, String fieldValue) throws DocumentException, WriterException, IOException {
|
|
|
|
|
// 获取位置(左上右下)
|
|
|
|
|
AcroFields.FieldPosition fieldPosition = form.getFieldPositions(fieldName).get(0);
|
|
|
|
|
// 绘制二维码
|
|
|
|
|
float width = fieldPosition.position.getTop() - fieldPosition.position.getBottom();
|
|
|
|
|
BarcodeQRCode pdf417 = new BarcodeQRCode(fieldValue, (int) width, (int) width, null);
|
|
|
|
|
// 生成二维码图像
|
|
|
|
|
Image image128 = pdf417.getImage();
|
|
|
|
|
// 条码位置
|
|
|
|
|
image128.setAbsolutePosition(fieldPosition.position.getLeft() + (fieldPosition.position.getRight() - fieldPosition.position.getLeft() - width) / 2
|
|
|
|
|
, fieldPosition.position.getBottom());
|
|
|
|
|
|
|
|
|
|
// 计算字段的宽度和高度
|
|
|
|
|
float fieldWidth = fieldPosition.position.getRight() - fieldPosition.position.getLeft();
|
|
|
|
|
float fieldHeight = fieldPosition.position.getTop() - fieldPosition.position.getBottom();
|
|
|
|
|
|
|
|
|
|
// 生成二维码
|
|
|
|
|
QRCodeWriter qrCodeWriter = new QRCodeWriter();
|
|
|
|
|
Map<EncodeHintType, Object> hints = new HashMap<>();
|
|
|
|
|
hints.put(EncodeHintType.MARGIN, 0);
|
|
|
|
|
BitMatrix bitMatrix = qrCodeWriter.encode(fieldValue, BarcodeFormat.QR_CODE, (int) fieldWidth, (int) fieldHeight, hints);
|
|
|
|
|
|
|
|
|
|
// 将 BitMatrix 转换为 BufferedImage
|
|
|
|
|
BufferedImage bufferedImage = toBufferedImage(bitMatrix);
|
|
|
|
|
|
|
|
|
|
// 将 BufferedImage 转换为 iText Image
|
|
|
|
|
Image image128 = Image.getInstance(bufferedImage, null);
|
|
|
|
|
|
|
|
|
|
// 扩大图像尺寸为原来的两倍
|
|
|
|
|
float imageWidth = image128.getWidth();
|
|
|
|
|
float imageHeight = image128.getHeight();
|
|
|
|
|
image128.scaleAbsolute(imageWidth, imageHeight);
|
|
|
|
|
|
|
|
|
|
// 设置图像的位置
|
|
|
|
|
float posX = fieldPosition.position.getLeft() + (fieldWidth - imageWidth) / 2;
|
|
|
|
|
float posY = fieldPosition.position.getBottom() - (imageHeight - fieldHeight) / 2;
|
|
|
|
|
image128.setAbsolutePosition(posX, posY);
|
|
|
|
|
|
|
|
|
|
// 获取PDF的第一页
|
|
|
|
|
PdfContentByte cb = stamper.getOverContent(1);
|
|
|
|
|
cb.addImage(image128);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static BufferedImage toBufferedImage(BitMatrix matrix) {
|
|
|
|
|
int width = matrix.getWidth();
|
|
|
|
|
int height = matrix.getHeight();
|
|
|
|
|
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
|
|
|
|
|
for (int x = 0; x < width; x++) {
|
|
|
|
|
for (int y = 0; y < height; y++) {
|
|
|
|
|
image.setRGB(x, y, matrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return image;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void setCheckBox(AcroFields form, PdfStamper stamper, String fieldName) throws DocumentException, IOException {
|
|
|
|
|
// 获取复选框位置以便在旁边绘制勾号
|
|
|
|
|
Rectangle boxRect = form.getFieldPositions(fieldName).get(0).position;
|
|
|
|
@ -296,10 +334,10 @@ public class HwPrintUtil {
|
|
|
|
|
//设置打印方向 PORTRAIT 竖向 REVERSE_LANDSCAPE 横向
|
|
|
|
|
pageFormat.setOrientation(PageFormat.PORTRAIT);
|
|
|
|
|
Paper paper = new Paper();
|
|
|
|
|
// 纸的大小
|
|
|
|
|
paper.setSize(221, 200);
|
|
|
|
|
// TODO 纸的大小
|
|
|
|
|
paper.setSize(160, 140);
|
|
|
|
|
// Print 区域
|
|
|
|
|
paper.setImageableArea(2, -15, 221, 200);
|
|
|
|
|
paper.setImageableArea(2, -15, 160, 140);
|
|
|
|
|
pageFormat.setPaper(paper);
|
|
|
|
|
Book book = new Book();
|
|
|
|
|
PDFPrintable printable = new PDFPrintable(document, Scaling.SCALE_TO_FIT);
|
|
|
|
|