java实现多张条码转成pdf文件
目录
需求
管理后台通过查询并生成多张条码并一起打印出来
思路
思路一
思路二
代码编写
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文件相关推荐
- java将WORD文档转换成pdf文件
总结对jacob和Itext学习总结.本文试验的是将WORD转换成PDF文件. 实现思路 一.先将WORD文档转换成HMTL文件格式(参阅我的前一文<JAVA操作WORD文档). 二.用流读取H ...
- java编程将HTML文件转换成PDF文件
网上有好几种方法可以将将HTML文件转换成PDF文件但是有些对HTML文件格式要求比较严格,稍微错了一些就不能生成我们所要的PDF文件,这里我推荐一个 PD4ML,它可以解决HTML文件格式不正确的问 ...
- c语言.jpg图片转成数组_多张jpg图片合成pdf文件
唐县职称公众号 微信视频号 评审条件(小程序) 关于如何将多张jpg图片合成pdf文件 首先再强调一下"扫描",不要用手机拍照.高拍仪代替扫描.否则责任自负. 如何将多张JPG图片 ...
- java实现图片jpg批量转换成pdf
java实现图片jpg批量转换成pdf package jpgTopdf; import java.awt.image.BufferedImage; import java.io.File; impo ...
- Java 读写docx文件后直接转成PDF文件方法
java将docx文件转成pdf文件的实现方法,需要的jar包下载地址:https://download.csdn.net/download/keke921231/10529672 1.读写docx文 ...
- 用Java将doc文档转成pdf格式
我这里使用的包是aspose-words-15.8.0-jdk16.jar和文件license.xml(用于去水印,放在项目的resources下) license.xml <License&g ...
- Java使用aspse实现Excel文件转换成PDF文件
使用Java代码把Excel文件转换成PDF文件 需要引用aspose包,引入操作我写了一个博客,地址如下 https://blog.csdn.net/weixin_46713508/article/ ...
- JAVA 将图片转换成pdf文件
/** * 将图片转换成pdf文件 *imgFilePath 需要被转换的img所存放的位置. 例如imgFilePath="D:\\projectPath\\55555.jpg" ...
- nodejs+html转换pdf,Nodejs 中将html转换成pdf文件
Nodejs 中将html转换成pdf文件,Nodejs Convert html into pdf 1. 下载phantomjs.exe,将该文件放在根目录 2. 编写pdf.js文件(在githu ...
最新文章
- 结合Flink,国内自研,大规模实时动态认知图谱平台——AbutionGraph |博文精选
- 用javascript 禁止右键,禁止复制,禁止粘贴
- U-Boot如何向内核传递Flash的分区信息
- koa2-cookie-session
- linux ftp用户指定多个目录,linux ftp服务器下用户限制目录的方法
- 时光轴一之listView实现时光轴效果
- OA实施成功的几个必备条件
- C++17 并行排序初体验
- Java基础-数组01
- 漫步者蓝牙耳机 LolliPods断连,充电异常问题解决
- 智博通 ZBT WG2626原机编程器
- 多目标优化(一)简单的 NSGA-Ⅱ
- SY6982E芯片了解
- 京东商品图片下载工具1.0 springboot版
- Codeforces Round #802 (Div. 2)
- 刚进IT不久爱撸铁的桃子曦
- ZXR10交换机命名规则
- 计算机通知英语作文范文,通知类英语作文范文
- java mongodb mybatis_Spring Boot (八)MyBatis + Docker + MongoDB 4.x
- 0921深度学习硬件CPU和GPU
热门文章
- jsp教学网站百度文库_精品课程JSP教学网站的评价研究
- 人工智能终端来了,你还在用过时的 iterm?
- ggplot2 保存图片字体错误问题
- java.lang.NoClassDefFoundError: com/sun/star/lang/DisposedException
- 东南大学计算机专业就业前景,东南大学自动化专业就业前景
- python修改电脑名称_windows更改计算机名称
- python 游戏辅助脚本_python版微信跳一跳游戏辅助
- moment 二十四小时制
- 实例讲解将Graph Explorer搬上JupyterLab
- 为什么公司的运营都会有负债的出现?