⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 barcodeinter25.java

📁 JFreeReport扩展库
💻 JAVA
字号:
/** * ======================================== * JFreeReport : a free Java report library * ======================================== * * Project Info:  http://www.object-refinery.com/jfreereport/index.html * Project Lead:  Thomas Morgner; * * (C) Copyright 2000-2002, by Simba Management Limited and Contributors. * * This library is free software; you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Foundation; * either version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along with this * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. * * The Original Code is 'iText, a free JAVA-PDF library'. * * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie. * All Rights Reserved. * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved. * * Contributor(s): all the names of the contributors are added in the source code * where applicable. * */package com.jrefinery.report.ext.barcode;import com.jrefinery.report.ElementAlignment;import org.jfree.ui.FloatDimension;import com.jrefinery.report.targets.FontDefinition;import java.awt.Color;import java.awt.Graphics2D;import java.awt.Image;import java.awt.geom.Dimension2D;import java.awt.geom.Rectangle2D;import java.awt.image.BufferedImage;/** Implements the code interleaved 2 of 5. The text can include * non numeric characters that are printed but do not generate bars. * The default parameters are: * <pre> *x = 0.8f; *n = 2; *font = BaseFont.createFont("Helvetica", "winansi", false); *size = 8; *baseline = size; *barHeight = size * 3; *textAlignment = Element.ALIGN_CENTER; *generateChecksum = false; *checksumText = false; * </pre> * * @author Paulo Soares (psoares@consiste.pt) */public class BarcodeInter25 extends Barcode{  /** The bars to generate the code.   */  private static byte BARS[][] =      {        {0, 0, 1, 1, 0},        {1, 0, 0, 0, 1},        {0, 1, 0, 0, 1},        {1, 1, 0, 0, 0},        {0, 0, 1, 0, 1},        {1, 0, 1, 0, 0},        {0, 1, 1, 0, 0},        {0, 0, 0, 1, 1},        {1, 0, 0, 1, 0},        {0, 1, 0, 1, 0}      };  private float multiplier;  /** Creates new BarcodeInter25 */  public BarcodeInter25()  {    setMultiplier(2);    setGenerateChecksum(false);    setDisplayChecksumText(false);  }  public float getMultiplier()  {    return multiplier;  }  public void setMultiplier(float multiplier)  {    this.multiplier = multiplier;  }  /** Deletes all the non numeric characters from <CODE>text</CODE>.   * @param text the text   * @return a <CODE>String</CODE> with only numeric characters   */  private static String keepNumbers(String text)  {    StringBuffer sb = new StringBuffer();    for (int k = 0; k < text.length(); ++k)    {      char c = text.charAt(k);      if (c >= '0' && c <= '9')        sb.append(c);    }    return sb.toString();  }  /** Calculates the checksum.   * @param text the numeric text   * @return the checksum   */  private static char getChecksum(String text)  {    int mul = 3;    int total = 0;    for (int k = text.length() - 1; k >= 0; --k)    {      int n = text.charAt(k) - '0';      total += mul * n;      mul ^= 2;    }    return (char) (((10 - (total % 10)) % 10) + '0');  }  /** Creates the bars for the barcode.   * @param text the text. It can contain non numeric characters   * @return the barcode   */  private static byte[] getBarsInter25(String text)  {    text = keepNumbers(text);    byte bars[] = new byte[text.length() * 5 + 7];    int pb = 0;    bars[pb++] = 0;    bars[pb++] = 0;    bars[pb++] = 0;    bars[pb++] = 0;    int len = text.length() / 2;    for (int k = 0; k < len; ++k)    {      int c1 = text.charAt(k * 2) - '0';      int c2 = text.charAt(k * 2 + 1) - '0';      byte b1[] = BARS[c1];      byte b2[] = BARS[c2];      for (int j = 0; j < 5; ++j)      {        bars[pb++] = b1[j];        bars[pb++] = b2[j];      }    }    bars[pb++] = 1;    bars[pb++] = 0;    bars[pb++] = 0;    return bars;  }  /** Gets the maximum area that the barcode and the text, if   * any, will occupy. The lower left corner is always (0, 0).   * @return the size the barcode occupies.   */  public Dimension2D getBarcodeSize()  {    float fontX = 0;    float fontY = 0;    FontDefinition font = getFont();    if (font != null)    {      float baseline = getBaseline();      if (baseline > 0)      {        fontY = baseline - getFontDescent(font.getFont());      }      else      {        fontY = -baseline + font.getFontSize();      }      String fullCode = getCode();      if (isGenerateChecksum() && isDisplayChecksumText())      {        fullCode += getChecksum(fullCode);      }      BarcodeSizeCalculator calc = new BarcodeSizeCalculator(font);      fontX = calc.getStringWidth(fullCode, 0, fullCode.length());    }    float fullWidth = Math.max(getFullWidth(), fontX);    float fullHeight = getBarHeight() + fontY;    return new FloatDimension(fullWidth, fullHeight);  }  private float getFullWidth ()  {    String fullCode = keepNumbers(getCode());    int len = fullCode.length();    if (isGenerateChecksum())    {      len += 1;    }    float fullWidth = len * (3 * getMinWidth() + 2 * getMinWidth() * getMultiplier()) +        (6 + getMultiplier()) * getMinWidth();    return fullWidth;  }  /** Creates an <CODE>Image</CODE> with the barcode.   * @param barColor the color of the bars. It can be <CODE>null</CODE>   * @param textColor the color of the text. It can be <CODE>null</CODE>   * @return the <CODE>Image</CODE>   */  public Image createImageWithBarcode(Color barColor, Color textColor)  {    if (barColor == null)      throw new NullPointerException("BarColor must not be null");    if (textColor == null)      throw new NullPointerException("TextColor must not be null");    String fullCode = getCode();    float textWidth = 0;    float barStartY = 0;    float textStartY = 0;    float barStartX = 0;    float textStartX = 0;    String bCode = keepNumbers(getCode());    if (isGenerateChecksum())    {      bCode += getChecksum(bCode);    }    float fullWidth = getFullWidth();    FontDefinition font = getFont();    if (font != null)    {      if (isGenerateChecksum() && isDisplayChecksumText())      {        fullCode += getChecksum(fullCode);      }      BarcodeSizeCalculator calc = new BarcodeSizeCalculator(font);      textWidth = calc.getStringWidth(fullCode, 0, fullCode.length());      float baseline = getBaseline();      if (baseline <= 0)        textStartY = getBarHeight() - baseline;      else      {        textStartY = -getFontDescent(font.getFont());        barStartY = textStartY + baseline;      }    }    if (getTextAlignment() == ElementAlignment.RIGHT)    {        if (textWidth > fullWidth)          barStartX = textWidth - fullWidth;        else          textStartX = fullWidth - textWidth;    }    else if (getTextAlignment() == ElementAlignment.CENTER)    {        if (textWidth > fullWidth)          barStartX = (textWidth - fullWidth) / 2;        else          textStartX = (fullWidth - textWidth) / 2;    }    int imageX = (int) Math.max(fullWidth, textWidth);    int imageY = (int) (getBarHeight() + textStartY);    BufferedImage image = new BufferedImage(imageX, imageY, BufferedImage.TYPE_INT_ARGB);    Graphics2D g2 = image.createGraphics();    g2.setPaint(barColor);    byte bars[] = getBarsInter25(bCode);    for (int k = 0; k < bars.length; ++k)    {      float w = 0;      if (bars[k] == 0)      {        w = getMinWidth();      }      else      {        w = getMinWidth() * getMultiplier();      }      if ((k % 2) == 0)      {        Rectangle2D.Float rect = new Rectangle2D.Float(barStartX, barStartY, w, getBarHeight());        g2.fill(rect);      }      barStartX += w;    }    if (font != null)    {      g2.setFont(font.getFont());      g2.setPaint(textColor);      g2.drawString(fullCode, textStartX, textStartY);    }    g2.dispose();    return image;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -