java实现多张条码转成pdf文件

目录

需求

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

思路

思路一

思路二

代码编写

maven pom文件

方法一

步骤一:创建barcode 条码文件

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

测试代码

方法二:

实现效果:

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

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

测试:

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


需求

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

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

思路

思路一

1.先生成一批条码

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

思路二

直接在pdf文件中画条码

代码编写

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

maven pom文件

先提供思路中所有的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
        

方法一

先放实现效果图:

java实现多张条码转成pdf文件_第1张图片

步骤一:创建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 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

方法二:

实现效果:

java实现多张条码转成pdf文件_第2张图片

步骤一:将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 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));
        }
    }

方法三:直接在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();
        }

    }
}

你可能感兴趣的:(javaweb,生成条码,转成pdf,创建pdf,iText,iTextpdf)