批量生成PDF条码
效果图:
//调用下方接口注意编码格式
if(CollectionUtil.isNotEmpty(productExList)){
String exportFileName = URLEncoder.encode("商品条码", "UTF-8") + DateUtil.format(new Date(), "yyyyMMddHHmmss");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + exportFileName + ".pdf");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("content-Type", "application/pdf");
generateProdBarcodePDF(productExList, response.getOutputStream(),response);
}else {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "没有要生成的条码请调整查询条件后重新生成");
}
/**
* 批量生成商品条形码pdf文件
*
* @param productExList 条码数据x信息【对象集合】
* @param os 输出流
* @throws IOException
*/
public static void generateProdBarcodePDF(List<MProductEx> productExList, OutputStream os,HttpServletResponse response) throws IOException {
Document document = null;
try {
document = new Document(new Rectangle(283F, 425F), 10, 10, 10, 10);
PdfWriter writer = PdfWriter.getInstance(document, os);
document.open();
PdfContentByte cb = writer.getDirectContent();
//判断列,一条数据只允许单列
int dataCount = productExList.stream().filter(f -> StringUtils.isNotEmpty(f.getProdLabel())).collect(Collectors.toList()).size();
int numColumns = 1;
if (dataCount > 1) {
numColumns = 2;
}
BaseFont bfChinese = BaseFont.createFont("C:\\Windows\\Fonts\\simsun.ttc,1", BaseFont.IDENTITY_H,
BaseFont.NOT_EMBEDDED);
Font fontChinese = new Font(bfChinese, 5, Font.NORMAL);
//创建一个两列的表格
PdfPTable headerTable = new PdfPTable(numColumns);
if(numColumns == 1){
headerTable.setWidthPercentage(40.0f);
}else {
headerTable.setWidthPercentage(80.0f);
}
PdfPCell rightCell = null;
Pattern pat = Pattern.compile("[\u4e00-\u9fa5]");
Matcher m = null;
for (MProductEx p : productExList) {
m = pat.matcher(p.getProdLabel());
if(StringUtils.isNullOrEmpty(p.getProdLabel()) || m.find()){
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "商品编号不能为中文且不能为空");
}
rightCell = new PdfPCell();
Image codeImage = BarcodeUtil.generateBarcodePrefixSuffix(cb, p.getProdLabel(), 72, 24);
Phrase imageP = new Phrase("", fontChinese);
//自己调整偏移值 主要是负值往下
imageP.add(new Chunk(codeImage, 15, -4));
String textNmShow ="商品名称:" + (StringUtils.isNotEmpty(p.getProdNm()) ? p.getProdNm() : "");
String textUnitShow ="计量单位:" + (StringUtils.isNotEmpty(p.getUnitNm()) ? p.getUnitNm() : "") ;
String textSpecShow ="规格: " + (StringUtils.isNotEmpty(p.getSpec()) ? p.getSpec() : "");
String textModelAndUnitShow ="型号:" + (StringUtils.isNotEmpty(p.getModel()) ? p.getModel() : "") +
" " + textUnitShow;
//Chunk chunkCd = new Chunk(textCdShow,fontChinese);
Chunk chunkNm = new Chunk(textNmShow,fontChinese);
//Chunk chunkUnit = new Chunk(textUnitShow,fontChinese);
Chunk chunkSpec = new Chunk(textSpecShow,fontChinese);
Chunk chunkModel = new Chunk(textModelAndUnitShow,fontChinese);
rightCell = new PdfPCell();
//imageP.setLeading(2f,1.5f);
rightCell.addElement(imageP);
//rightCell.addElement(chunkCd);
rightCell.addElement(new Chunk(" ",fontChinese));
rightCell.addElement(chunkNm);
//rightCell.addElement(chunkUnit);
rightCell.addElement(chunkSpec);
rightCell.addElement(chunkModel);
//false自动换行
rightCell.setNoWrap(false);
//行间距
//rightCell.setLeading(40f,10.0f);
rightCell.setHorizontalAlignment(Element.ALIGN_LEFT);
rightCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
rightCell.setFixedHeight(70.0f);
//rightCell.setPadding(4.0f);//填充
headerTable.addCell(rightCell);
}
if(productExList.size()%2 ==1){
rightCell = new PdfPCell();
new Chunk("END",fontChinese);
headerTable.addCell(rightCell);
}
document.add(headerTable);
os.flush();
} catch (DocumentException e) {
e.printStackTrace();
} finally {
if(Objects.nonNull(document)){
document.close();
}
if (Objects.nonNull(os)) {
os.close();
}
}
}