package support;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import org.krysalis.barcode4j.impl.code128.Code128Bean;
import org.krysalis.barcode4j.impl.code128.Code128Constants;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;
public class Label implements Printable {
private double spaceFromTop; //Distance border top to border top first label (first top-left)
private double spaceFromLeft; //Distance border left to border left first label (first top-left)
private double ofsX; //Label Offset Y
private double ofsY; //Label Offset Y
private double iofsX; //Object Offset X
private double iofsY; //Object Offset Y
private double labelHeight; //Altezza della label
private int labelWidth; //Larghezza della label
private int qtyLabelOnPage; //Quantita' di label presenti nel foglio
private int dpi;
private boolean borderOn = false;
private ArrayList<ArrayList<String>> info; //Records/Fields
public Label(double marginX, double marginY, ArrayList<ArrayList<String>> info, int dpi, boolean borderOn) {
this.borderOn = borderOn;
this.labelHeight = 90; //Altezza della label
this.labelWidth = 165; //larghezza della label
this.qtyLabelOnPage = info.size(); //Quantita' di label presenti nel foglio deve corrispondere con la dimensione dell'array dati
this.spaceFromTop = 19f; //Distanza della Label dal bordo superiore del foglio
this.spaceFromLeft = 25f; //Distanza della Label dal bordo sinistro del foglio
if((this.spaceFromTop-marginY) > marginY) { //Offset della label verticale
this.ofsY = this.spaceFromTop - marginY;
} else {
this.ofsY = marginY;
}
if((this.spaceFromLeft-marginX) > marginX) { //Offset della label orizzontale
this.ofsX = this.spaceFromLeft - marginX;
} else {
this.ofsX = marginX;
}
this.iofsX = 15; //Offset di posizione per tutti gli oggetti stampati
this.iofsY = 10; //Offset di posizione per tutti gli oggetti stampati
this.info = info;
this.dpi = dpi;
}
private double offSetX() {
return ofsX + iofsX;
}
private double offSetY(int index) {
return ofsY + iofsY + labelHeight*index;
}
/**
* Metodo per la generazione degli oggetti e localizzazione sulla pagina fisica.
*/
public int print(Graphics g, PageFormat pf, int page) {
//--- Create the Graphics2D object
Graphics2D g2d = (Graphics2D) g;
//g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
//g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
//g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//--- Translate the origin to 0,0 for the top left corner
g2d.translate(pf.getImageableX(), pf.getImageableY());
//System.out.println("Page n." + page);
//Dichiarazioni dei fonts da utilizzare per i testi
Font f1 = new Font("Times New Roman", Font.BOLD, 16);
Font f2 = new Font("Times New Roman", Font.PLAIN, 10);
Font f3 = new Font("Arial", Font.BOLD, 10);
Font f4 = new Font("Arial", Font.BOLD, 12);
Font f5 = new Font("Arial", Font.PLAIN, 10);
Font f6 = new Font("Arial", Font.BOLD, 10);
for(int itemData = 0; itemData < qtyLabelOnPage; itemData++) {
//Composizione dei dati
String address2 = info.get(itemData).get(5) + " " + info.get(itemData).get(6) + " " + info.get(itemData).get(7); //String ADDRESS2 Composizione
//String cmr = "SDA: " + info.get(itemData).get(28);
String packing = " BOX " + info.get(itemData).get(9) + "/" + info.get(itemData).get(10);
String quantity = " QTY: " + info.get(itemData).get(11);
String barcodeData = info.get(itemData).get(13); //String BARCODE Composizione ID_Correlation
if(this.borderOn==true) {
g2d.drawRect(UnitConv.mm2px(ofsX, dpi), UnitConv.mm2px(ofsY + labelHeight*itemData, dpi), UnitConv.mm2px(this.labelWidth, dpi), UnitConv.mm2px(this.labelHeight, dpi));
}
//Inizializzazione Font e inserimento stringa di stampa I/OFFSET Pos X, DPI I/OFFSET Pos Y, DPI
g2d.setFont(f1); g2d.drawString("Mia Società", UnitConv.mm2px(this.offSetX() + 00, dpi), UnitConv.mm2px(this.offSetY(itemData) + 10, dpi)); //String BANCASELLA
g2d.setFont(f2); g2d.drawString("SOC s.r.l.", UnitConv.mm2px(this.offSetX() + 90, dpi), UnitConv.mm2px(this.offSetY(itemData) + 10, dpi)); //String STM
g2d.setFont(f3); g2d.drawString("ID RAC", UnitConv.mm2px(this.offSetX() + 0, dpi), UnitConv.mm2px(this.offSetY(itemData) + 14, dpi)); //String ID_GROUP
g2d.setFont(f4); g2d.drawString(info.get(itemData).get(1), UnitConv.mm2px(this.offSetX() + 20, dpi), UnitConv.mm2px(this.offSetY(itemData) + 14, dpi)); //Value ID_GROUP
g2d.setFont(f5); g2d.drawString("Destinazione:", UnitConv.mm2px(this.offSetX() + 50, dpi), UnitConv.mm2px(this.offSetY(itemData) + 22, dpi)); //String Destinazione
g2d.setFont(f5); g2d.drawString(info.get(itemData).get(2), UnitConv.mm2px(this.offSetX() + 80, dpi), UnitConv.mm2px(this.offSetY(itemData) + 22, dpi)); //Value CO
g2d.setFont(f5); g2d.drawString(info.get(itemData).get(3), UnitConv.mm2px(this.offSetX() + 80, dpi), UnitConv.mm2px(this.offSetY(itemData) + 26, dpi)); //Value NOMINATIVO
g2d.setFont(f5); g2d.drawString(info.get(itemData).get(4), UnitConv.mm2px(this.offSetX() + 80, dpi), UnitConv.mm2px(this.offSetY(itemData) + 30, dpi)); //Value INDIRIZZO1
g2d.setFont(f5); g2d.drawString(address2, UnitConv.mm2px(this.offSetX() + 80, dpi), UnitConv.mm2px(this.offSetY(itemData) + 34, dpi)); //Value POSTAL CODE + CITY + PROVINCE
g2d.setFont(f5); g2d.drawString(info.get(itemData).get(12).substring(0, 8), UnitConv.mm2px(this.offSetX() + 00, dpi), UnitConv.mm2px(this.offSetY(itemData) + 43, dpi)); //Value CMR
g2d.setFont(f5); g2d.drawString(info.get(itemData).get(12).substring(8), UnitConv.mm2px(this.offSetX() + 49, dpi), UnitConv.mm2px(this.offSetY(itemData) + 43, dpi)); //Value CMR
g2d.setFont(f5); g2d.drawString(packing, UnitConv.mm2px(this.offSetX() + 100, dpi), UnitConv.mm2px(this.offSetY(itemData) + 43, dpi)); //Value BOX/TOTBOX
g2d.setFont(f5); g2d.drawString(quantity, UnitConv.mm2px(this.offSetX() + 100, dpi), UnitConv.mm2px(this.offSetY(itemData) + 47, dpi)); //Value QTY
g2d.setFont(f6); g2d.drawString(info.get(itemData).get(13).substring(1, 16),UnitConv.mm2px(this.offSetX() + 00, dpi), UnitConv.mm2px(this.offSetY(itemData) + 47, dpi)); //Value ID_CORRELATION Start
g2d.setFont(f6); g2d.drawString(info.get(itemData).get(13).substring(16), UnitConv.mm2px(this.offSetX() + 49, dpi), UnitConv.mm2px(this.offSetY(itemData) + 47, dpi)); //Value ID_CORRELATION End
//Stampa del barcode riportante ID_CORRELATION StartID_CORRELATION End (16+16 digit) come immagine
Code128Bean barcode128Bean = new Code128Bean();
barcode128Bean.setCodeset(Code128Constants.CODESET_A);
//Configure the barcode generator adjust barcode width here
final double moduleWidth = 1f;
barcode128Bean.setModuleWidth(UnitConv.in2mm(moduleWidth / dpi));
barcode128Bean.doQuietZone(false);
barcode128Bean.setBarHeight(10);
barcode128Bean.setFontName("ARIAL");
barcode128Bean.setFontSize(5);
try {
BitmapCanvasProvider canvas = new BitmapCanvasProvider(dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);
barcode128Bean.generateBarcode(canvas, barcodeData);
canvas.finish();
BufferedImage image = canvas.getBufferedImage();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
g2d.drawImage(image, UnitConv.mm2px(this.offSetX(),dpi), UnitConv.mm2px(this.offSetY(itemData) + 48,dpi), image.getWidth(), image.getHeight(), null);
} catch (IOException e2) {
JOptionPane.showMessageDialog(null, e2.getMessage());
return (NO_SUCH_PAGE);
}
}
return (PAGE_EXISTS);
}
}