【Java】批量生成条形码-itextpdf

批量生成条形码
Controller

@ApiOperation("商品一览批量生成商品条形码")@PostMapping("/batchGenerateProdBarCode")public void batchGenerateProdBarCode(@RequestBody ProductListCondition productListCondition,HttpServletResponse response){importExportService.batchGenerateProdBarCode(response, productListCondition);}

Service

 /*** 商品一览批量生成商品条形码* @param productListCondition* @return*/public void batchGenerateProdBarCode(HttpServletResponse response,ProductListCondition productListCondition){List<MProductEx> productExList = mProductListDao.selectmproduct(productListCondition.getProdCdDis(),productListCondition.getBrand());try {int dataCount = productExList.stream().filter(f -> StringUtils.isNotEmpty(f.getProdLabel())).collect(Collectors.toList()).size();if(dataCount == 0){response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "没有要生成的条码请调整查询条件后重新生成");}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, "没有要生成的条码请调整查询条件后重新生成");}}catch (Exception e){e.printStackTrace();}}
/*** 批量生成商品条形码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(120F, 85F), 10, 2, 10, 2);PdfWriter writer = PdfWriter.getInstance(document, os);document.open();PdfContentByte cb = writer.getDirectContent();BaseFont bfChinese = BaseFont.createFont("C:\\Windows\\Fonts\\simsun.ttc,1",  BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);Font fontChinese = new Font(bfChinese, 2, Font.NORMAL);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, "商品编号不能为中文且不能为空");}document.newPage();//创建一个一列的表格PdfPTable headerTable = new PdfPTable(1);headerTable.setWidthPercentage(70.0F);PdfPCell rightCell = new PdfPCell();Image codeImage = BarcodeUtil.generateBarcodePrefixSuffix(cb, p.getProdLabel(), 22f, 6f);Phrase imageP = new Phrase("", fontChinese);//自己调整偏移值 主要是负值往下imageP.add(new Chunk(codeImage, 5, -1));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(26.0f);//rightCell.setPadding(4.0f);//填充headerTable.addCell(rightCell);
//                headerTable.setSplitLate(false);
//                headerTable.setSplitRows(true);document.add(headerTable);}//document.add(headerTable);os.flush();} catch (DocumentException e) {e.printStackTrace();} finally {if(Objects.nonNull(document)){document.close();}if (Objects.nonNull(os)) {os.close();}}}/*** 批量生成商品条形码pdf文件导出适配A4纸** @param productExList 条码数据x信息* @param os    输出流* @throws IOException*/public static void generateProdBarcodeA4PDF(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();}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/41360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Spring-Security后,浏览器不能缓存的问题

Spring-Security在默认情况下是不允许客户端进行缓存的&#xff0c;在使用时可以通过禁用Spring-Security中的cacheControl配置项允许缓存。 protected void configure(HttpSecurity http) throws Exception {// 允许缓存配置http.headers().cacheControl().disable(); }

Java中使用流将两个集合根据某个字段进行过滤去重?

Java中使用流将两个集合根据某个字段进行过滤去重? 在Java中&#xff0c;您可以使用流(Stream)来过滤和去重两个集合。下面是一个示例代码&#xff0c;展示如何根据对象的某个字段进行过滤和去重操作&#xff1a; import java.util.ArrayList; import java.util.List; impor…

“代码驭宠而行“:探索Python的魔法世界,开启编程奇幻之旅!

文章目录 &#x1f340;引言&#x1f340;第一步&#xff1a;安装Python和开发环境&#x1f340;第二步&#xff1a;掌握基本语法&#x1f340;第三步&#xff1a;使用Python库和模块&#x1f340;第四步&#xff1a;实践项目和练习&#x1f340;第五步&#xff1a;学习进阶主题…

origin修改默认的字体等

因为默认是中文宋体&#xff0c;每次切换成英文尤其是希腊字母就很麻烦。 选择菜单栏的【设置】——【选项】点击。 弹出窗口中选择【文本字体】 设置成你需要的字体就好。 这里同样可以更改页面、图等的默认设置。 效果&#xff1a; 选择插入文字后&#xff0c;自动更改成…

银河麒麟V10 达梦安装教程

安装前先准备要安装包&#xff0c;包需要需要区分X86和arm架构。 版本为&#xff1a;dm8_20230419_FTarm_kylin10_sp1_64.iso 达梦数据库下载地址&#xff1a; https://www.aliyundrive.com/s/Qm7Es5BQM5U 第一步创建用户 su - root 1. 创建安装用户组 dminstall。 groupad…

前馈神经网络优化器

引用的知乎上的文章内容&#xff0c;现在有些地方还不太明白&#xff0c;留待以后查看。 import math import numpy as np import matplotlib.pyplot as pltRATIO 3 # 椭圆的长宽比 LIMIT 1.2 # 图像的坐标轴范围class PlotComparaison(object):"""多种优化…

Python爬虫的应用场景与技术难点:如何提高数据抓取的效率与准确性

作为专业爬虫程序员&#xff0c;我们在数据抓取过程中常常面临效率低下和准确性不高的问题。但不用担心&#xff01;本文将与大家分享Python爬虫的应用场景与技术难点&#xff0c;并提供一些实际操作价值的解决方案。让我们一起来探索如何提高数据抓取的效率与准确性吧&#xf…

python3实现线性规划求解

Background 对于数学规划问题&#xff0c;有很多的实现。MatlabYALMIPCPLEX这个组合应该是比较主流的&#xff0c;尤其是在电力相关系统中占据着比较重要的地位。MATLAB是一个强大的数值计算工具&#xff0c;用于数学建模、算法开发和数据分析。Yalmip是一个MATLAB工具箱&#…

MongoDB:MySQL,Redis,ES,MongoDB的应用场景

简单明了说明MySQL,ES,MongoDB的各自特点,应用场景,以及MongoDB如何使用的第一章节. 一. SQL与NoSQL SQL被称为结构化查询语言.是传统意义上的数据库,数据之间存在很明确的关联关系,例如主外键关联,这种结构可以确保数据的完整性(数据没有缺失并且正确).但是正因为这种严密的结…

神经网络基础-神经网络补充概念-34-正则化

概念 正则化是一种用于控制模型复杂度并防止过拟合的技术&#xff0c;在机器学习和深度学习中广泛应用。它通过在损失函数中添加一项惩罚项来限制模型的参数&#xff0c;从而使模型更倾向于选择简单的参数配置。 理解 L1 正则化&#xff08;L1 Regularization&#xff09;&a…

数据分析 | Boosting与Bagging的区别

Boosting与Bagging的区别 Bagging思想专注于降低方差&#xff0c;操作起来较为简单&#xff0c;而Boosting思想专注于降低整体偏差来降低泛化误差&#xff0c;在模型效果方面的突出表现制霸整个弱分类器集成的领域。具体区别体现在如下五点&#xff1a; 弱评估器&#xff1a;Ba…

vb数控加工技术教学素材资源库的设计和构建

摘 要 20世纪以来,社会生产力迅速发展,科学技术突飞猛进,人们进行信息交流的深度与广度不断增加,信息量急剧增长,传统的信息处理与决策的手段已不能适应社会的需要,信息的重要性和信息处理问题的紧迫性空前提高了,面对着日益复杂和不断发展,变化的社会环境,特别是企业…

Windows上使用dump文件调试

dump文件 dump文件记录当前程序运行某一时刻的信息&#xff0c;包括内存&#xff0c;线程&#xff0c;线程栈&#xff0c;变量等等&#xff0c;相当于调试程序时运行到某个断点上&#xff0c;把程序运行的信息记录下来。可以通过Windbg打开dump&#xff0c;查看程序运行的变量…

mysql 修改存储路径,重启失败授权

目录 停掉mysql修改mysql 配置文件my.cnf目录授权重启mysql 停掉mysql 修改mysql 配置文件my.cnf 更改mysql 存储位置 到/data/mysql_data目录下&#xff1a; datadir/data/mysql/mysql_data/socket/data/mysql/mysql_data/mysql.sockmysql 默认路么径在 /var/lib/mysql/ 防止…

go_并发编程(1)

go并发编程 一、 并发介绍1&#xff0c;进程和线程2&#xff0c;并发和并行3&#xff0c;协程和线程4&#xff0c;goroutine 二、 Goroutine1&#xff0c;使用goroutine1&#xff09;启动单个goroutine2&#xff09;启动多个goroutine 2&#xff0c;goroutine与线程3&#xff0…

在 React 中获取数据的6种方法

一、前言 数据获取是任何 react 应用程序的核心方面。对于 React 开发人员来说&#xff0c;了解不同的数据获取方法以及哪些用例最适合他们很重要。 但首先&#xff0c;让我们了解 JavaScript Promises。 简而言之&#xff0c;promise 是一个 JavaScript 对象&#xff0c;它将…

Python Web:Django、Flask和FastAPI框架对比

原文&#xff1a;百度安全验证 Django、Flask和FastAPI是Python Web框架中的三个主要代表。这些框架都有着各自的优点和缺点&#xff0c;适合不同类型和规模的应用程序。 1. Django&#xff1a; Django是一个全功能的Web框架&#xff0c;它提供了很多内置的应用程序和工具&am…

排序+运算>直接运算的效率的原因分析

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

ADIS16470和ADIS16500从到手到读出完整数据,附例程

由于保密原因&#xff0c;不能上传我这边的代码&#xff0c;我所用的开发环境是IAR&#xff0c; 下边转载别的博主的文章&#xff0c;他用的是MDK 下文的博主给了你一个很好的思路&#xff0c;特此提出表扬 最下方是我做的一些手册批注&#xff0c;方便大家了解这个东西 原文链…

如何利用 ChatGPT 进行自动数据清理和预处理

推荐&#xff1a;使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 ChatGPT 已经成为一把可用于多种应用的瑞士军刀&#xff0c;并且有大量的空间将 ChatGPT 集成到数据科学工作流程中。 如果您曾经在真实数据集上训练过机器学习模型&#xff0c;您就会知道数据清理和预…