使用barcode4j+itextpdf把条形码写入PDF文件

项目中需要在打印文件时生成一个条形码,并把条形码加在文件第一页的左上角一同打印出来,在此分享一下,具体代码如下:

首先使用了barcode4j生成条形码

/**
     * 生成条形码
     * @param code 生成条码码的编号
     * @throws Exception
     */
private static byte[] genBarCodeJpg(String barCode) throws Exception{
        Code128Bean bean = new Code128Bean();
        final int dpi = 250;
        //样式
        bean.setModuleWidth(0.21);
        bean.setBarHeight(7);
        bean.doQuietZone(false);
        bean.setQuietZone(2);

        //两边空白区        
        bean.setFontName("Helvetica");
        bean.setFontSize(3);
        bean.setMsgPosition(HumanReadablePlacement.HRP_BOTTOM);

        ByteArrayOutputStream out = null;
        try {
            out = new ByteArrayOutputStream();
            BitmapCanvasProvider canvas = new BitmapCanvasProvider(out,
                    "image/png", dpi, BufferedImage.TYPE_BYTE_BINARY
                    , true, 0);

            bean.generateBarcode(canvas, barCode);
            canvas.finish();
            return out.toByteArray();

        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
            e.printStackTrace();
        } finally {
            try {
                if (out != null)
                    out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

然后通过itextpdf把条形码写入文件

 /**
     * 将条形码写入PDF文件
     * @param pdfFile PDF类型的文件(word等需要转换为PDF)
     * @param barcode 生成条形码的code
     * @return
     * @throws Exception
     */
    private File pdfAddControlCode(File pdfFile, String barCode)throws Exception {
        if(StingUtils.isBlank(barCode)){
            return pdfFile;
        }
        com.itextpdf.text.Font wf = new com.itextpdf.text.Font(DocumentPlugin.FONT_SIMHEI, 19);
        wf.setColor(BaseColor.BLUE);

        InputStream is = new FileInputStream(pdfFile);
        PdfReader reader = new PdfReader(is);

        File file = File.createTempFile(String.valueOf(System.nanoTime()), ".pdf");
        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(file));

        //设置文件为只读
        //stamp.setEncryption(null, OWNER_PASSWORD.getBytes(), 0, PdfWriter.ENCRYPTION_AES_128);

        //PDF文件的总页数
        //int number_of_pages = reader.getNumberOfPages();
        //取得第一页
        com.itextpdf.text.Rectangle rectangle = reader.getPageSize(0);
        float width = rectangle.getWidth();
        float height = rectangle.getHeight();

        //是否竖版
        //boolean direction = height >= width;

        //取得PDF文件的第一页
        // getOverContent 水印会把正文盖住    getUnderContent 水印会被正文的图片盖住        
        PdfContentByte contentByte = stamp.getOverContent(0);

        PdfGState gs = new PdfGState();
        gs.setFillOpacity(0.7f);// 设置透明度
        gs.setStrokeOpacity(0.7f);
        contentByte.setGState(gs);

        //在第一页加上条形码
        com.itextpdf.text.Image img = com.itextpdf.text.Image.getInstance(genBarCodeJpg(barCode));
        img.setAlignment(1);//居中显示

        //显示位置,根据需要调整
        img.setAbsolutePosition(100, height - 40);

        //显示为原条形码图片大小的比例,百分比
        img.scalePercent(30);

        contentByte.addImage(img);

        stamp.close();
        IOUtils.closeQuietly(is);

        return file;
    }
{CSDN:CODE:738333}

你可能感兴趣的:(IO操作)