目录
需求
管理后台通过查询并生成多张条码并一起打印出来
思路
思路一
思路二
代码编写
maven pom文件
方法一
步骤一:创建barcode 条码文件
步骤二:将创建的barcode 条码文件放入pdf文件中
测试代码
方法二:
实现效果:
步骤一:将svg转成pdf,将之前代码增加一种类型
步骤二:将多张pdf合成一张pdf文件
测试:
方法三:直接在pdf文件中画条码,比较高效的
注:如果不想看本博客的长长思路,直接从目录中跳到相应代码中去,本博客提供相关思路和相关问题上出现的问题
1.先生成一批条码
2.将条码生成好的条码放在一张pdf文件中
直接在pdf文件中画条码
既然想好了思路,那下面进行代码编写:
先提供思路中所有的maven pom文件:
com.itextpdf
itextpdf
5.5.13
com.itextpdf
itext-asian
5.2.0
com.itextpdf
itext7-core
7.1.7
pom
org.apache.xmlgraphics
batik-util
1.11
org.apache.xmlgraphics
batik-transcoder
1.11
org.apache.xmlgraphics
fop
2.3
先放实现效果图:
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();
}
}
/**
* 将图片放入pdf文件中
*
* @param pdfPath pdf文件路径
* @param showCount 一行展示几个条码
* @param imageList 条码集合
* @throws FileNotFoundException 文件找不到
* @throws DocumentException pdf文档异常
*/
public static void picToPdf(String pdfPath, int showCount, List 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 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
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文件
*
* @param filePaths 文件路径集合
* @param newfile 新的pdf路径
* @return
*/
public static boolean mergePdfFiles(List 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 svgFilePaths = new ArrayList<>();
List 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 条码转换成pdf
SvgConverter.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));
}
}
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();
}
}
}