项目中需要在打印文件时生成一个条形码,并把条形码加在文件第一页的左上角一同打印出来,在此分享一下,具体代码如下:
首先使用了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}