package org.jboss.seam.pdf.ui; import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.lang.reflect.Field; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import org.jboss.seam.core.Manager; import org.jboss.seam.pdf.ITextUtils; import org.jboss.seam.pdf.ui.ITextComponent; import org.jboss.seam.ui.graphicImage.GraphicImageResource; import org.jboss.seam.ui.graphicImage.GraphicImageStore; import org.jboss.seam.ui.graphicImage.GraphicImageStore.ImageWrapper; import org.jboss.seam.ui.graphicImage.Image.Type; import com.lowagie.text.Image; import com.lowagie.text.pdf.*; /** * based on JBSEAM-1155 submission by user ivan */ public class UIBarCode extends ITextComponent { private Barcode barcode; private Object itextObject; private String type; private String code; private String codeType; private Float xpos; private Float ypos; private Float rotDegrees; private String altText; private Float barHeight; private Float textSize; private Float minBarWidth; private Float barMultiplier; String barColor; String textColor; public String getCode() { return (String) valueBinding("code", code); } public void setCode(String code) { this.code = code; } public String getType() { return (String) valueBinding("type", type); } public void setType(String type) { this.type = type; } public String getCodeType() { return (String) valueBinding("codeType", codeType); } public void setCodeType(String codeType) { this.codeType = codeType; } public Float getRotDegrees() { return (Float) valueBinding("rotDegrees", rotDegrees); } public void setRotDegrees(Float rotDegrees) { this.rotDegrees = rotDegrees; } public Float getXpos() { return (Float) valueBinding("xpos", xpos); } public void setXpos(Float xpos) { this.xpos = xpos; } public Float getYpos() { return (Float) valueBinding("ypos", ypos); } public void setYpos(Float ypos) { this.ypos = ypos; } public String getAltText() { return (String) valueBinding("altText", altText); } public void setAltText(String altText) { this.altText = altText; } public Float getBarHeight() { return (Float) valueBinding("barHeight", barHeight); } public void setBarHeight(Float barHeight) { this.barHeight = barHeight; } public Float getBarMultiplier() { return (Float) valueBinding("barMultiplier", barMultiplier); } public void setBarMultiplier(Float barMultiplier) { this.barMultiplier = barMultiplier; } public Float getMinBarWidth() { return (Float) valueBinding("minBarWidth", minBarWidth); } public void setMinBarWidth(Float minBarWidth) { this.minBarWidth = minBarWidth; } public Float getTextSize() { return (Float) valueBinding("textSize", textSize); } public void setTextSize(Float textSize) { this.textSize = textSize; } public String getBarColor() { return (String) valueBinding("barColor", barColor); } public void setBarColor(String barColor) { this.barColor = barColor; } public String getTextColor() { return (String) valueBinding("textColor", textColor); } public void setTextColor(String textColor) { this.textColor = textColor; } @Override public void restoreState(FacesContext context, Object state) { Object[] values = (Object[]) state; super.restoreState(context, values[0]); type = (String) values[1]; code = (String) values[2]; xpos = (Float) values[5]; ypos = (Float) values[6]; rotDegrees = (Float) values[7]; altText = (String) values[8]; barHeight = (Float) values[9]; textSize = (Float) values[10]; minBarWidth = (Float) values[11]; barMultiplier = (Float) values[12]; codeType = (String) values[13]; barColor = (String) values[14]; textColor = (String) values[15]; } @Override public Object saveState(FacesContext context) { Object[] values = new Object[16]; values[0] = super.saveState(context); values[1] = type; values[2] = code; values[5] = xpos; values[6] = ypos; values[7] = rotDegrees; values[8] = altText; values[9] = barHeight; values[10] = textSize; values[11] = minBarWidth; values[12] = barMultiplier; values[13] = codeType; values[14] = barColor; values[15] = textColor; return values; } @Override public Object getITextObject() { return itextObject; } @Override public void createITextObject(FacesContext context) throws IOException { barcode = createBarcodeType(getType()); barcode.setCode(getCode()); Integer codeVal = lookupCodeType(getCodeType()); if (codeVal != null) { barcode.setCodeType(codeVal); } if (getAltText() != null) { barcode.setAltText(getAltText()); } if (getBarHeight() != null) { barcode.setBarHeight(getBarHeight()); } if (getBarMultiplier() != null) { barcode.setN(getBarMultiplier()); } if (getMinBarWidth() != null) { barcode.setX(getMinBarWidth()); } UIDocument doc = (UIDocument) findITextParent(getParent(), UIDocument.class); if (doc != null) { PdfWriter writer = (PdfWriter) doc.getWriter(); PdfContentByte cb = writer.getDirectContent(); Image image = barcode.createImageWithBarcode(cb, ITextUtils.colorValue(getBarColor()), ITextUtils.colorValue(getTextColor())); if (getRotDegrees() != null) { image.setRotationDegrees(getRotDegrees()); } if (getXpos() != null && getYpos() != null) { image.setAbsolutePosition(getXpos(), getYpos()); } itextObject = image; } else { Color bars = ITextUtils.colorValue(getBarColor()); if (bars == null) { bars = Color.BLACK; } byte[] imageData = imageToByteArray(barcode.createAwtImage(bars, Color.WHITE)); itextObject = new ImageWrapper(imageData, Type.IMAGE_JPEG); } } private Integer lookupCodeType(String codeType) { if (codeType == null || codeType.length() == 0) { return null; } try { Field field = Barcode.class.getDeclaredField(codeType.toUpperCase()); return field.getInt(Barcode.class); } catch (Exception e) { throw new RuntimeException(e); } } private Barcode createBarcodeType(String barcodeType) { if (barcodeType == null || barcodeType.length() == 0) { return new Barcode128(); } if (barcodeType.equalsIgnoreCase("code128")) { return new Barcode128(); } else if (barcodeType.equalsIgnoreCase("code39")) { return new Barcode39(); } else if (barcodeType.equalsIgnoreCase("codabar")) { return new BarcodeCodabar(); } else if (barcodeType.equalsIgnoreCase("ean")) { return new BarcodeEAN(); } else if (barcodeType.equalsIgnoreCase("inter25")) { return new BarcodeInter25(); } else if (barcodeType.equalsIgnoreCase("postnet")) { return new BarcodePostnet(); } throw new RuntimeException("Unknown barcode type " + barcodeType); } @Override public void removeITextObject() { itextObject = null; } @Override public void handleAdd(Object other) { throw new RuntimeException("can't add " + other.getClass().getName() + " to barcode"); } public static byte[] imageToByteArray(java.awt.Image image) throws IOException { BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB); Graphics gc = bufferedImage.createGraphics(); gc.drawImage(image, 0, 0, null); ByteArrayOutputStream stream = new ByteArrayOutputStream(); ImageIO.write(bufferedImage, "jpeg", stream); return stream.toByteArray(); } @Override public void noITextParentFound() { try { FacesContext context = FacesContext.getCurrentInstance(); ResponseWriter response = context.getResponseWriter(); response.startElement("img", null); GraphicImageStore store = GraphicImageStore.instance(); String key = store.put((ImageWrapper) itextObject); String url = context.getExternalContext().getRequestContextPath() + GraphicImageResource.GRAPHIC_IMAGE_RESOURCE_PATH + "/" + key + Type.IMAGE_JPEG.getExtension(); String jsessionid=((HttpServletRequest)context.getExternalContext().getRequest()).getRequestedSessionId(); if(jsessionid!=null) url=url+";jsessionid="+jsessionid; response.writeAttribute("src", url, null); response.endElement("img"); Manager.instance().beforeRedirect(); } catch (Exception e) { throw new RuntimeException(e); } } }