package com.celements.photo; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.krysalis.barcode4j.BarcodeException; import org.krysalis.barcode4j.BarcodeGenerator; import org.krysalis.barcode4j.BarcodeUtil; import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider; import org.xml.sax.SAXException; import org.xwiki.component.annotation.Component; import org.xwiki.component.annotation.Requirement; import org.xwiki.context.Execution; import org.xwiki.script.service.ScriptService; import com.xpn.xwiki.XWikiContext; import com.xpn.xwiki.web.Utils; @Component("barcode") public class BarcodeScriptService implements ScriptService { private String MODULE_WIDTH = "0.33mm"; private String MODULE_HEIGHT = "15mm"; private static Log LOGGER = LogFactory.getFactory().getInstance( BarcodeScriptService.class); @Requirement Execution execution; public int getEAN8Checksum(int number) { String nrStr = Integer.toString(number); while(nrStr.length() < 7) { nrStr = "0" + nrStr; } if(nrStr.length() > 7) { nrStr = nrStr.substring(0, 7); } byte[] nr = nrStr.getBytes(); int s1 = nr[1] + nr[3] + nr[5]; int s2 = 3 * (nr[0] + nr[2] + nr[4] + nr[6]); return (10 - ((s1 + s2) % 10)) % 10; } public void generate(String number, OutputStream out) { String moduleHeight = getContext().getRequest().get("moduleHeight"); if((moduleHeight == null) || "".equals(moduleHeight.trim())) { moduleHeight = MODULE_HEIGHT; } String moduleWidth = getContext().getRequest().get("moduleWidth"); if((moduleWidth == null) || "".equals(moduleWidth.trim())) { moduleWidth = MODULE_WIDTH; } BitmapCanvasProvider provider = new BitmapCanvasProvider( out, "image/png", 150, BufferedImage.TYPE_BYTE_GRAY, true, 0); DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder(); String xmlConf = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><barcode><ean8>" + "<height>" + moduleHeight + "</height>" + "<module-width>" + moduleWidth + "</module-width>" + "</ean8></barcode>"; InputStream in = new ByteArrayInputStream(xmlConf.getBytes()); try { Configuration cfg = builder.build(in); in.close(); BarcodeGenerator gen = BarcodeUtil.getInstance().createBarcodeGenerator(cfg); gen.generateBarcode(provider, number); provider.finish(); } catch (ConfigurationException e) { LOGGER.error("Exception in configuration for barcode module.", e); } catch (SAXException e) { LOGGER.error(e); } catch (IOException e) { LOGGER.error(e); } catch (BarcodeException e) { LOGGER.error("Exception in barcode module.", e); } } private XWikiContext getContext() { return (XWikiContext)Utils.getComponent(Execution.class).getContext().getProperty( "xwikicontext"); } }