pdf文件生成及条形码生成

我就是我 2023-09-27 13:55 258阅读 0赞

1.导入依赖

  1. <!-- pdf-->
  2. <dependency>
  3. <groupId>com.lowagie</groupId>
  4. <artifactId>itext</artifactId>
  5. <version>2.0.6</version>
  6. </dependency>
  7. <!-- 条形码-->
  8. <dependency>
  9. <groupId>net.sf.barcode4j</groupId>
  10. <artifactId>barcode4j</artifactId>
  11. <version>2.1</version>
  12. </dependency>

2.示例

controller层

  1. /**
  2. * 生成pdf
  3. */
  4. @RequestMapping("generationPickingPDF")
  5. @ResponseBody
  6. public String generationPickingPDF(@RequestParam("id") Long id, HttpServletResponse response) {
  7. try {
  8. String prerecordInPdfLocation = "/tmp" + File.separator;
  9. File bakFile = new File(prerecordInPdfLocation);
  10. DeliveryOrder deliveryOrder = deliveryOrderBiz.selectDeliveryOrderById(id);
  11. SessionStaffInfo user = getUser();
  12. if (!deliveryOrder.getPickingOper().equals(user.getStaffInfo().getStaffName())) {
  13. log.error("当前操作人不是拣货人!");
  14. throw new BusinessException("当前操作人不是拣货人!");
  15. }
  16. String pdfName = deliveryOrderBiz.generationPickingPDF(deliveryOrder.getId(), "/tmp");
  17. bakFile = new File(pdfName);
  18. BufferedInputStream bis = null;
  19. BufferedOutputStream bos = null;
  20. OutputStream fos = null;
  21. InputStream fis = null;
  22. fis = new FileInputStream(bakFile);
  23. bis = new BufferedInputStream(fis);
  24. fos = response.getOutputStream();
  25. bos = new BufferedOutputStream(fos);
  26. response.setContentType("application/pdf");
  27. int bytesRead = 0;
  28. byte[] buffer = new byte[512];
  29. while ((bytesRead = bis.read(buffer)) != -1) {
  30. bos.write(buffer);// 将文件发送到客户端 , 0, bytesRead
  31. }
  32. bos.close();
  33. bis.close();
  34. fos.close();
  35. fis.close();
  36. } catch (Exception e) {
  37. log.error("生成出库单pdf报错", e);
  38. return e.getMessage();
  39. }
  40. return WmsControllerHelper.renderSuccessJson();
  41. }

service层

  1. /**
  2. * 生成pdf
  3. */
  4. public String generationPickingPDF(Long id, String PDFPath) throws Exception {
  5. //pdf板式设置
  6. Document document = new Document(PageSize.A4, 5, 5, 0, 0);
  7. //设置中文字体
  8. BaseFont bfChinese = BaseFont.createFont("/font/SimHei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
  9. //寻常显示字体
  10. Font keyfont = new Font(bfChinese, 10, Font.COURIER);
  11. Font textfont = new Font(bfChinese, 10, Font.NORMAL);
  12. //标题字体
  13. Font Titlefont = new Font(bfChinese, 16, Font.COURIER);
  14. //设置生成路径
  15. File bakDir = new File(PDFPath);
  16. if (!bakDir.isDirectory()) {
  17. bakDir.mkdirs();
  18. }
  19. String PDFName = PDFPath + File.separator + "出库单_" + id + ".pdf";
  20. PdfWriter.getInstance(document, new FileOutputStream(new File(PDFName)));
  21. //打开文件
  22. document.open();
  23. document.newPage();
  24. //创建标题
  25. Paragraph title = new Paragraph("拣货任务", Titlefont);
  26. title.setAlignment(Element.ALIGN_CENTER);
  27. document.add(title);
  28. //表头查询
  29. DeliveryOrder deliveryOrder = new DeliveryOrder();
  30. deliveryOrder.setId(id);
  31. DeliveryOrder deliveryOrder1 = this.selectOne(deliveryOrder);
  32. SimpleDateFormat sdfs = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
  33. String vendor = sdfs.format(new Date());
  34. //表头样式,创建一个两列的表头
  35. Table tHeader = new Table(2);
  36. //设置每列的列宽
  37. float[] widthsHeader = {2f, 3f};
  38. tHeader.setWidths(widthsHeader);
  39. tHeader.setWidth(100);
  40. tHeader.setPadding(2);
  41. //设置表格线不显示
  42. tHeader.setBorder(0);
  43. tHeader.getDefaultLayout().setBorder(PdfPCell.NO_BORDER);
  44. //出库单号
  45. Cell c1Header = new Cell(new Paragraph("出库单号: " + deliveryOrder1.getDeliveryOrderCode(), keyfont));
  46. tHeader.addCell(c1Header);
  47. // 显示条形码
  48. String filepath = PDFPath + File.separator + id + ".jpg";
  49. OneBarcodeUtil.createBarCode(deliveryOrder1.getDeliveryOrderCode(), filepath);
  50. Image jpeg = Image.getInstance(filepath);
  51. jpeg.setAlignment(Image.ALIGN_CENTER);
  52. jpeg.scaleAbsolute(240, 70);
  53. c1Header = new Cell(jpeg);
  54. c1Header.setRowspan(5);
  55. tHeader.addCell(c1Header);
  56. //客户名称
  57. c1Header = new Cell(new Paragraph("客户名称: " + deliveryOrder1.getCustomerName(), keyfont));
  58. tHeader.addCell(c1Header);
  59. //拣货人员
  60. c1Header = new Cell(new Paragraph("拣货人员: " + deliveryOrder1.getPickingOper(), keyfont));
  61. tHeader.addCell(c1Header);
  62. //拣货时间
  63. c1Header = new Cell(new Paragraph("拣货时间: " + vendor, keyfont));
  64. tHeader.addCell(c1Header);
  65. //添加
  66. tHeader.setBorder(0);
  67. document.add(tHeader);
  68. //生成内容表头,定义一个有5列的表格
  69. Table t = new Table(5);
  70. //设置每列的宽度
  71. float[] widths = {1.0f, 1.7f, 0.8f, 2f, 0.8f};
  72. t.setWidths(widths);
  73. t.setWidth(100);
  74. t.setPadding(2);
  75. Cell c1 = new Cell(new Paragraph("商品货号", keyfont));
  76. c1.setHorizontalAlignment(Cell.ALIGN_CENTER);
  77. c1.setVerticalAlignment(Cell.ALIGN_MIDDLE);
  78. t.addCell(c1);
  79. c1 = new Cell(new Paragraph("商品名称", keyfont));
  80. c1.setHorizontalAlignment(Cell.ALIGN_CENTER);
  81. c1.setVerticalAlignment(Cell.ALIGN_MIDDLE);
  82. t.addCell(c1);
  83. c1 = new Cell(new Paragraph("库存类型", keyfont));
  84. c1.setHorizontalAlignment(Cell.ALIGN_CENTER);
  85. c1.setVerticalAlignment(Cell.ALIGN_MIDDLE);
  86. t.addCell(c1);
  87. c1 = new Cell(new Paragraph("库位信息", keyfont));
  88. c1.setHorizontalAlignment(Cell.ALIGN_CENTER);
  89. c1.setVerticalAlignment(Cell.ALIGN_MIDDLE);
  90. t.addCell(c1);
  91. c1 = new Cell(new Paragraph("出库数量", keyfont));
  92. c1.setHorizontalAlignment(Cell.ALIGN_CENTER);
  93. c1.setVerticalAlignment(Cell.ALIGN_MIDDLE);
  94. t.addCell(c1);
  95. //查询详情
  96. DeliveryOrderDetail deliveryOrderDetail = new DeliveryOrderDetail();
  97. deliveryOrderDetail.setDeliveryOrderCode(deliveryOrder1.getDeliveryOrderCode());
  98. List<DeliveryOrderDetail> deliveryOrderDetails = deliveryOrderDetailMapper.selectDeliveryOrderDetailList(deliveryOrderDetail);
  99. //生成内容
  100. for (DeliveryOrderDetail detail : deliveryOrderDetails) {
  101. Cell c2 = new Cell(new Paragraph(detail.getBarCode(), textfont));//商品货号
  102. c2.setHorizontalAlignment(Cell.ALIGN_CENTER);
  103. c2.setVerticalAlignment(Cell.ALIGN_MIDDLE);
  104. t.addCell(c2);
  105. c2 = new Cell(new Paragraph(detail.getItemName(), textfont));//商品名称
  106. c2.setHorizontalAlignment(Cell.ALIGN_CENTER);
  107. c2.setVerticalAlignment(Cell.ALIGN_MIDDLE);
  108. t.addCell(c2);
  109. String inventoryName = StrUtil.equals(detail.getInventoryType(), "ZP") ? "正品" : "次品";
  110. c2 = new Cell(new Paragraph(inventoryName, textfont));//库存类型
  111. c2.setHorizontalAlignment(Cell.ALIGN_CENTER);
  112. c2.setVerticalAlignment(Cell.ALIGN_MIDDLE);
  113. t.addCell(c2);
  114. c2 = new Cell(new Paragraph(detail.getForzenInfo(), textfont));//库位信息
  115. c2.setHorizontalAlignment(Cell.ALIGN_CENTER);
  116. c2.setVerticalAlignment(Cell.ALIGN_MIDDLE);
  117. t.addCell(c2);
  118. c2 = new Cell(new Paragraph(String.valueOf(detail.getOutQty()), textfont));//出库数量
  119. c2.setHorizontalAlignment(Cell.ALIGN_CENTER);
  120. c2.setVerticalAlignment(Cell.ALIGN_MIDDLE);
  121. t.addCell(c2);
  122. }
  123. document.add(t);
  124. document.close();
  125. return PDFName;
  126. }

条形码工具类

  1. package com.qst.security.wms.util;
  2. import org.krysalis.barcode4j.impl.code39.Code39Bean;
  3. import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
  4. import org.krysalis.barcode4j.tools.UnitConv;
  5. import java.awt.image.BufferedImage;
  6. import java.io.*;
  7. public class OneBarcodeUtil {
  8. public static void main(String[] args) {
  9. try {
  10. //Create the barcode bean
  11. Code39Bean bean = new Code39Bean();
  12. final int dpi = 100;
  13. //Configure the barcode generator
  14. bean.setModuleWidth(UnitConv.in2mm(1.0f / dpi)); //makes the narrow bar
  15. //width exactly one pixel
  16. bean.setWideFactor(3);
  17. bean.doQuietZone(false);
  18. File outputFile = new File("d:\\out.png");
  19. OutputStream out = new FileOutputStream(outputFile);
  20. try {
  21. //Set up the canvas provider for monochrome JPEG output
  22. BitmapCanvasProvider canvas = new BitmapCanvasProvider(
  23. out, "image/png", dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);
  24. bean.generateBarcode(canvas, "A123456");
  25. //Signal end of generation
  26. canvas.finish();
  27. } finally {
  28. out.close();
  29. }
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. /**
  35. * 创建二维码图片
  36. * @param code
  37. * @param path
  38. */
  39. public static void createBarCode(String code, String path){
  40. try {
  41. Code39Bean bean = new Code39Bean();
  42. final int dpi = 150;
  43. bean.setModuleWidth(UnitConv.in2mm(1.0f / dpi));
  44. bean.setWideFactor(3);
  45. bean.doQuietZone(false);
  46. File outputFile = new File(path);
  47. OutputStream out = new FileOutputStream(outputFile);
  48. try {
  49. BitmapCanvasProvider canvas = new BitmapCanvasProvider(
  50. out, "image/png", dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);
  51. bean.generateBarcode(canvas, code);
  52. canvas.finish();
  53. } finally {
  54. out.close();
  55. }
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. }
  59. }
  60. /**
  61. * 生成二维码图片
  62. * @author ggboy
  63. */
  64. public static byte[] createBarCode(String code) throws IOException {
  65. int dpi = 150;
  66. ByteArrayOutputStream out = new ByteArrayOutputStream();
  67. try {
  68. Code39Bean bean = new Code39Bean();
  69. bean.setModuleWidth(UnitConv.in2mm(1.0f / dpi));
  70. bean.setWideFactor(3);
  71. bean.doQuietZone(false);
  72. BitmapCanvasProvider canvas = new BitmapCanvasProvider(out, "image/png", dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);
  73. bean.generateBarcode(canvas, code);
  74. canvas.finish();
  75. return out.toByteArray();
  76. } finally {
  77. try { out.close(); } catch (IOException e) { }
  78. }
  79. }
  80. }

3 总结

Java生成条形码的方案 — barcode4j、zxing

barcode4j

barcode4j开源Java条形码生成库。支持多种编码格式,比如:code-39,code-128等,详细的格式可以参照下面

Welcome to Barcode4J

zxing

是由google开源的1D/2D编解码类库。目标是能够对QR编码、Data Matrix、UPC的1D条形码进行解码。 其提供了多种平台下的客户端包括:J2ME、J2SE和Android

详细参照:

[itext]Java生成PDF文件_SKM!!!的博客-CSDN博客

Java条形码生成技术-Barcode4j_清水的博客-CSDN博客_barcode4j

Java实现二维码生成

发表评论

表情:
评论列表 (有 0 条评论,258人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Itext生成PDF文件

    最近做一个项目的报表,设计导出问题,要求pdf、excel、word。说实话一个字,烦。写个备忘录吧。。。虽然还是很烦 所需依赖:itext-asian-5.2.0.jar

    相关 条形码生成

    条形码的生成 条形码简介 条形码:是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符 条形码的种类 条形码分为一位条形码和二