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 条码转换成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();
        }

    }
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 斑马EPLPDF 的具体实现可以分为以下几个步骤: 1. 获取 EPL 文件:从打印机或其他来源获取 EPL 文件,EPL 是打印机控制语言,包含打印机需要打印的指令和数据。 2. 解析 EPL 文件:使用 Java 程序读取 EPL 文件中的指令和数据,并将其化为打印机可以理解的格式。 3. 渲染 PDF 文件:使用 Java 库将解析出来的指令和数据渲染 PDF 文件,可以使用 iText 或 Apache PDFBox 等开源库进行处理。 4. 输出 PDF 文件:将生PDF 文件输出到指定的目录或上传至服务器等其他目的。 需要注意的是,不同类型的 EPL 文件可能具有不同的格式和指令,因此在实现过程中需要对不同的 EPL 文件进行适配和处理。同时,由于打印机类型和设置的差异,可能会出现一些不兼容的情况,需要在实现过程中进行充分的测试和验证。 ### 回答2: Java 斑马EPL PDF 的具体实现可以参考以下步骤: 1. 首先,需要引入Java EPL打印机库,例如Zebra EPL2库。可以在Maven或Gradle等构建工具中添加相关依赖。 2. 通过Java代码连接到相应的打印机设备,例如Zebra打印机。 3. 创建EPL打印机对象,并设置打印机参数,如打印机分辨率、打印速度等。 4. 使用EPL命令生所需打印的内容,例如条码、文本、图像等。EPL使用一系列预定义的命令来描述打印的对象。可以使用Java字符串拼接或使用EPL模板生器等方法构建EPL指令。 5. 将生的EPL指令发送给打印机进行打印。可以使用Java的网络通讯库,如Socket,连接到打印机并发送EPL命令。 6. 等待打印机打印完确认。可以通过监听打印机返回的状态或使用延迟等待的方式。 7. 打印完后,将打印结果保存为PDF文件。可以使用JavaPDF库,如iText或Apache PDFBox等来创建PDF文件,并将EPL打印的内容换为PDF文档的内容。 总结来说,Java 实现 EPL PDF 的过程包括连接打印机、生EPL指令、发送指令给打印机、监听打印机状态、确认打印完,最后将打印结果换为PDF文件。 ### 回答3: Java斑马EPLPDF的具体实现可以通过以下步骤来实现: 1. 首先,需要使用Java的打印相关API来获取并解析EPL(Eltron Programming Language)打印指令。EPL是一种用于标签打印机的打印语言,可以通过编程方式生标签打印指令。 2. 在获取到EPL指令后,可以使用JavaPDF库,如iText或Apache PDFBox,来创建一个PDF文档对象。 3. 然后,根据EPL指令的内容和格式,通过编程方式在PDF文档中添加对应的文本、图像或条形码等元素。可以使用PDF库的函数和方法来设置各个元素的属性,如大小、位置、字体样式等。 4. 在将EPL指令换为PDF元素时,需要根据EPL指令中的坐标和变量来确定元素在PDF中的位置和属性。可以使用字符串分割和正则表达式等技术来解析EPL指令中的内容,并通过PDF库的函数和方法来创建对应的PDF元素。 5. 最后,将创建好的PDF文档保存到指定的路径或将其输出到客户端浏览器供用户下载。 需要注意的是,具体实现中可能会涉及到EPL指令的各种语法和标签的解析,以及PDF元素的属性设置和布局等问题。因此,建议参考相关的文档和教程,并根据具体需求进行相应的代码编写和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值