目录

需求

管理后台通过查询并生成多张条码并一起打印出来

思路

思路一

思路二

代码编写

maven pom文件

方法一

步骤一:创建barcode 条码文件

步骤二:将创建的barcode 条码文件放入pdf文件中

测试代码

方法二:

实现效果:

步骤一:将svg转成pdf,将之前代码增加一种类型

步骤二:将多张pdf合成一张pdf文件

测试:

方法三:直接在pdf文件中画条码,比较高效的


需求

管理后台通过查询并生成多张条码并一起打印出来

注:如果不想看本博客的长长思路,直接从目录中跳到相应代码中去,本博客提供相关思路和相关问题上出现的问题

思路

思路一

1.先生成一批条码

2.将条码生成好的条码放在一张pdf文件中

思路二

直接在pdf文件中画条码

代码编写

既然想好了思路,那下面进行代码编写:

maven pom文件

先提供思路中所有的maven pom文件:

        <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.1.7</version><type>pom</type></dependency><dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-util</artifactId><version>1.11</version></dependency><dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-transcoder</artifactId><version>1.11</version></dependency><dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>fop</artifactId><version>2.3</version></dependency>

方法一

先放实现效果图:

步骤一:创建barcode 条码文件

import com.alibaba.druid.util.StringUtils;
import org.krysalis.barcode4j.impl.code39.Code39Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.MimeTypes;
import org.krysalis.barcode4j.tools.UnitConv;import java.awt.image.BufferedImage;
import java.io.*;/*** @author Administrator*/
public class BarCodeUtil {/*** 生成文件** @param msg* @param path* @return*/public static File generateFile(int type,String msg, String path) {File file = new File(path);try {if(!file.exists()){file.getParentFile().mkdir();}generate(type,msg, new FileOutputStream(file));} catch (FileNotFoundException e) {throw new RuntimeException(e);}return file;}/*** 生成字节** @param msg* @return*/public static byte[] generate(int type ,String msg) {ByteArrayOutputStream ous = new ByteArrayOutputStream();generate(type,msg, ous);return ous.toByteArray();}/*** 生成到流* @param type* @param msg* @param ous*/public static void generate(int type,String msg, OutputStream ous) {if (StringUtils.isEmpty(msg) || ous == null) {return;}Code39Bean bean = new Code39Bean();// 精细度final int dpi = 150;// module宽度final double moduleWidth = UnitConv.in2mm(1.0f / dpi);// 配置对象bean.setModuleWidth(moduleWidth);// msg高度bean.setWideFactor(3);// 白边显示bean.doQuietZone(true);try {// 输出到流BitmapCanvasProvider canvas = new BitmapCanvasProvider(ous, MimeTypes.MIME_PNG, dpi,BufferedImage.SCALE_REPLICATE, false, 0);// 生成条形码bean.generateBarcode(canvas, msg);// 结束绘制canvas.finish();} catch (IOException e) {e.printStackTrace();}}

步骤二:将创建的barcode 条码文件放入pdf文件中

 /*** 将图片放入pdf文件中** @param pdfPath   pdf文件路径* @param showCount 一行展示几个条码* @param imageList 条码集合* @throws FileNotFoundException 文件找不到* @throws DocumentException     pdf文档异常*/public static void picToPdf(String pdfPath, int showCount, List<Image> imageList) throws FileNotFoundException, DocumentException {File file = new File(pdfPath);if (!file.exists()) {file.getParentFile().mkdir();}//创建pdf文档对象RectangleReadOnly rectangleReadOnly = new RectangleReadOnly(55, 40);Document document = new Document(rectangleReadOnly);//将文件输出流与pdf对象,进行关联PdfWriter.getInstance(document, new FileOutputStream(pdfPath));//打开文档document.open();//创建表格对象if(showCount != 1 ){PdfPTable table = new PdfPTable(showCount);PdfPCell cell = new PdfPCell();cell.setBorder(Rectangle.ALIGN_LEFT);for (Image image:imageList) {cell.setImage(image);table.addCell(cell);}document.add(table);}else{document.setPageCount(imageList.size());for (int i = 0; i < imageList.size(); i++) {Image image = imageList.get(i);image.setAbsolutePosition(0, 0);image.scaleToFit(rectangleReadOnly.getWidth(), rectangleReadOnly.getHeight());document.newPage();document.add(image);}}//关闭文档document.close();}

测试代码

 public static void testPic2Pdf() throws IOException, DocumentException {List<Image> files = new ArrayList<>();for (int i = 0; i < 3; i++) {Integer integer = RandomMathUtil.getRandomInt(10000000, 99999999);byte[] generate = BarCodeUtil.generate(2, integer + "");System.out.println(integer);files.add(Image.getInstance(generate));}picToPdf("G://test.pdf", 1, files);}

但是会有一个问题,就是出来的图片打印出来经常扫不出来,因为文件是png,虽然看起来比较清楚,打印出来效果不是很明显,所以改成svg格式的图片,但是操作比较麻烦,不能多张svg转成pdf文件,又要换一种思路:

将svg转成pdf,将多张pdf合成一张pdf

方法二:

实现效果:

步骤一:将svg转成pdf,将之前代码增加一种类型

import com.alibaba.druid.util.StringUtils;
import org.krysalis.barcode4j.impl.code128.Code128Bean;
import org.krysalis.barcode4j.output.BarcodeCanvasSetupException;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.output.svg.SVGCanvasProvider;
import org.krysalis.barcode4j.tools.MimeTypes;
import org.krysalis.barcode4j.tools.UnitConv;
import org.w3c.dom.DocumentFragment;import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.awt.image.BufferedImage;
import java.io.*;/*** @author Administrator*/
public class BarCodeUtil {/*** 生成文件** @param msg* @param path* @return*/public static File generateFile(int type,String msg, String path) {File file = new File(path);try {if(!file.exists()){file.getParentFile().mkdir();}generate(type,msg, new FileOutputStream(file));} catch (FileNotFoundException e) {throw new RuntimeException(e);}return file;}/*** 生成字节** @param msg* @return*/public static byte[] generate(int type ,String msg) {ByteArrayOutputStream ous = new ByteArrayOutputStream();generate(type,msg, ous);return ous.toByteArray();}/*** 生成到流* @param type*          1:生成svg图片*          其他代表生成png* @param msg 条码内容* @param ous 输出流*/public static void generate(int type,String msg, OutputStream ous) {if (StringUtils.isEmpty(msg) || ous == null) {return;}Code128Bean bean = new Code128Bean();// 精细度final int dpi = 150;// module宽度final double moduleWidth = UnitConv.in2mm(1.0f / dpi);// 配置对象bean.setModuleWidth(moduleWidth);// msg高度//bean.setWideFactor(3);// 白边显示bean.doQuietZone(true);try {if(type == 1 ){SVGCanvasProvider canvas = new SVGCanvasProvider(false, 0);bean.generateBarcode(canvas, msg);DocumentFragment frag = canvas.getDOMFragment();TransformerFactory factory = TransformerFactory.newInstance();Transformer trans = factory.newTransformer();Source src = new DOMSource(frag);Result res = new StreamResult(ous);trans.transform(src, res);}else{// 输出到流BitmapCanvasProvider canvas = new BitmapCanvasProvider(ous, MimeTypes.MIME_PNG, dpi,BufferedImage.SCALE_REPLICATE, false, 0);// 生成条形码bean.generateBarcode(canvas, msg);// 结束绘制canvas.finish();}} catch (IOException e) {e.printStackTrace();} catch (TransformerConfigurationException e) {e.printStackTrace();} catch (BarcodeCanvasSetupException e) {e.printStackTrace();} catch (TransformerException e) {e.printStackTrace();}}public static void main(String[] args) throws FileNotFoundException {/* String msg = "1234567891011";String path = "barcode.svg";generateFile(1,msg, path);*/}
}

步骤二:将多张pdf合成一张pdf文件

/*** 合并pdf文件** @param filePaths 文件路径集合* @param newfile   新的pdf路径* @return*/public static boolean mergePdfFiles(List<String> filePaths, String newfile) {boolean retValue = false;Document document = null;try {File outFile = new File(newfile);if (!outFile.exists()) {outFile.getParentFile().mkdir();}document = new Document(new PdfReader(filePaths.get(0)).getPageSize(1));PdfCopy copy = new PdfCopy(document, new FileOutputStream(newfile));document.open();for (int i = 0; i < filePaths.size(); i++) {PdfReader reader = new PdfReader("file:///" + filePaths.get(i));int n = reader.getNumberOfPages();for (int j = 1; j <= n; j++) {document.newPage();PdfImportedPage page = copy.getImportedPage(reader, j);copy.addPage(page);}}retValue = true;} catch (Exception e) {e.printStackTrace();} finally {document.close();}return retValue;}

测试:

public static void testSvg2Pdf() {List<String> svgFilePaths = new ArrayList<>();List<String> pdfFilePaths = new ArrayList<>();try {for (int i = 0; i < 5; i++) {Integer integer = RandomMathUtil.getRandomInt(10000000, 99999999);System.out.println(integer);//生成svg 条码String svgPath = String.format(filePath, "svg", integer + ".svg");BarCodeUtil.generateFile(1, integer + "", svgPath);svgFilePaths.add(svgPath);String pdfpath = String.format(filePath, "pdf", integer + ".pdf");//svg 条码转换成pdfSvgConverter.transSvg2Pdf(svgPath, pdfpath);pdfFilePaths.add(pdfpath);}FileUtils.mergePdfFiles(pdfFilePaths, "G://test.pdf");} catch (Exception e) {log.error(e.getMessage());} finally {FileUtils.delFile(new File(basefilePath));}}

方法三:直接在pdf文件中画条码,比较高效的

import com.itextpdf.barcodes.Barcode128;
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
import com.itextpdf.layout.element.Image;public class TestIText
{final static String dest = "d:/barcode/barcode3.pdf";public static PdfFormXObject createBarcode(String code, PdfDocument pdfDoc){Barcode128 code128 = new Barcode128(pdfDoc);code128.setCode("Barcode128 barcode");code128.setSize(10);code128.setBarHeight(60);code128.setCode(code);code128.setBaseline(9);code128.setCodeType(Barcode128.CODE128);// Notice that in itext5 in default PdfPCell constructor (new PdfPCell(Image img))// the image does not fit the cell, but it does in addCell// .setAutoScale(true);PdfFormXObject pdfFormXObject = code128.createFormXObject(ColorConstants.BLACK,ColorConstants.BLACK,pdfDoc);return pdfFormXObject;}public static Image createBarcodeImage(float mw, float mh, String code, PdfDocument pdfDoc){PdfFormXObject pdfFormXObject = createBarcode(code, pdfDoc);Image image = new Image(pdfFormXObject).scale(mw, mh);return image;}public static void main(String[] args){try{PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));int n = 5;for (int i = 0; i < n; i++){PdfPage pdfPage = pdfDoc.addNewPage(new PageSize(156, 114));PdfCanvas canvas = new PdfCanvas(pdfPage);PdfFormXObject pdfFormXObject = createBarcode("BC1001235678" + i, pdfDoc);System.out.println(pdfFormXObject.getHeight());//Image image = createBarcodeImage(30, 20, "BC001235678" + i, pdfDoc);//ImageData imageData;canvas.addXObject(pdfFormXObject, 30, 40, 0.85f);//canvas.addXObject(pdfFormXObject, 10, 5);//canvas.addImage(image, 5, 5, true);}pdfDoc.close();}catch (Exception e){e.printStackTrace();}}
}

java实现多张条码转成pdf文件相关推荐

  1. java将WORD文档转换成pdf文件

    总结对jacob和Itext学习总结.本文试验的是将WORD转换成PDF文件. 实现思路 一.先将WORD文档转换成HMTL文件格式(参阅我的前一文<JAVA操作WORD文档). 二.用流读取H ...

  2. java编程将HTML文件转换成PDF文件

    网上有好几种方法可以将将HTML文件转换成PDF文件但是有些对HTML文件格式要求比较严格,稍微错了一些就不能生成我们所要的PDF文件,这里我推荐一个 PD4ML,它可以解决HTML文件格式不正确的问 ...

  3. c语言.jpg图片转成数组_多张jpg图片合成pdf文件

    唐县职称公众号 微信视频号 评审条件(小程序) 关于如何将多张jpg图片合成pdf文件 首先再强调一下"扫描",不要用手机拍照.高拍仪代替扫描.否则责任自负. 如何将多张JPG图片 ...

  4. java实现图片jpg批量转换成pdf

    java实现图片jpg批量转换成pdf package jpgTopdf; import java.awt.image.BufferedImage; import java.io.File; impo ...

  5. Java 读写docx文件后直接转成PDF文件方法

    java将docx文件转成pdf文件的实现方法,需要的jar包下载地址:https://download.csdn.net/download/keke921231/10529672 1.读写docx文 ...

  6. 用Java将doc文档转成pdf格式

    我这里使用的包是aspose-words-15.8.0-jdk16.jar和文件license.xml(用于去水印,放在项目的resources下) license.xml <License&g ...

  7. Java使用aspse实现Excel文件转换成PDF文件

    使用Java代码把Excel文件转换成PDF文件 需要引用aspose包,引入操作我写了一个博客,地址如下 https://blog.csdn.net/weixin_46713508/article/ ...

  8. JAVA 将图片转换成pdf文件

    /** * 将图片转换成pdf文件 *imgFilePath 需要被转换的img所存放的位置. 例如imgFilePath="D:\\projectPath\\55555.jpg" ...

  9. nodejs+html转换pdf,Nodejs 中将html转换成pdf文件

    Nodejs 中将html转换成pdf文件,Nodejs Convert html into pdf 1. 下载phantomjs.exe,将该文件放在根目录 2. 编写pdf.js文件(在githu ...

最新文章

  1. 结合Flink,国内自研,大规模实时动态认知图谱平台——AbutionGraph |博文精选
  2. 用javascript 禁止右键,禁止复制,禁止粘贴
  3. U-Boot如何向内核传递Flash的分区信息
  4. koa2-cookie-session
  5. linux ftp用户指定多个目录,linux ftp服务器下用户限制目录的方法
  6. 时光轴一之listView实现时光轴效果
  7. OA实施成功的几个必备条件
  8. C++17 并行排序初体验
  9. Java基础-数组01
  10. 漫步者蓝牙耳机 LolliPods断连,充电异常问题解决
  11. 智博通 ZBT WG2626原机编程器
  12. 多目标优化(一)简单的 NSGA-Ⅱ
  13. SY6982E芯片了解
  14. 京东商品图片下载工具1.0 springboot版
  15. Codeforces Round #802 (Div. 2)
  16. 刚进IT不久爱撸铁的桃子曦
  17. ZXR10交换机命名规则
  18. 计算机通知英语作文范文,通知类英语作文范文
  19. java mongodb mybatis_Spring Boot (八)MyBatis + Docker + MongoDB 4.x
  20. 0921深度学习硬件CPU和GPU

热门文章

  1. jsp教学网站百度文库_精品课程JSP教学网站的评价研究
  2. 人工智能终端来了,你还在用过时的 iterm?
  3. ggplot2 保存图片字体错误问题
  4. java.lang.NoClassDefFoundError: com/sun/star/lang/DisposedException
  5. 东南大学计算机专业就业前景,东南大学自动化专业就业前景
  6. python修改电脑名称_windows更改计算机名称
  7. python 游戏辅助脚本_python版微信跳一跳游戏辅助
  8. moment 二十四小时制
  9. 实例讲解将Graph Explorer搬上JupyterLab
  10. 为什么公司的运营都会有负债的出现?