package printtest;
import javax.imageio.ImageIO;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.MediaPrintableArea;
import javax.print.attribute.standard.PrintQuality;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;
import com.mask.util.barcode.BarCode;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class SaiLunPrint extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
public SaiLunPrint() {
MenuTest menuTest = new MenuTest();
Container c = this.getContentPane();
Button btn = new Button("点击这里,打印条码");
btn.setSize(1, 1);
btn.setBackground(Color.GREEN);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
byte b[]=new byte[100000];
RandomAccessFile raf1= null;
try {
raf1=new RandomAccessFile("D:\\dt900\\up\\DULP1.TXT","r");
raf1.read(b);
} catch (FileNotFoundException e1) {
JOptionPane.showMessageDialog(null, "文件不存在,请先用采集器扫描后再打印!", "打印失败", JOptionPane.ERROR_MESSAGE);
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "读取文件错误,请重启程序!", "错误", JOptionPane.ERROR_MESSAGE);
}
String s = new String(b);
String str[]=s.split(" ");
List<String> list = new ArrayList<String>();
for (int i = 0; i < str.length-1; i++) {
//System.out.println(str[i]+"--"+i);
list.add(str[i]);
}
// for (int i = 0; i < list.size(); i++) {
// System.out.println("list:"+list.get(i)+"--"+i);
// }
// System.out.println("list:"+list.size());
if(list.size()==0) System.exit(0);
test(list);
try {
raf1.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
// c.add(null, BorderLayout.WEST);
// c.add(null, BorderLayout.EAST);
c.add(btn, BorderLayout.CENTER);
// c.add(null, BorderLayout.SOUTH);
this.setJMenuBar(menuTest);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 220);
setTitle("赛轮条码打印");
//setUndecorated(true);
setLocation(400, 350);
show();
}
class MenuTest extends JMenuBar {
/**
*
*/
private static final long serialVersionUID = 1L;
private JDialog aboutDialog;
public MenuTest() {
JMenu fileMenu = new JMenu("文件");
JMenuItem printMenuItem = new JMenuItem("打印条码", KeyEvent.VK_E);
JMenuItem delFileMenuItem = new JMenuItem("删除条码文件", KeyEvent.VK_E);
JMenuItem exitMenuItem = new JMenuItem("退出", KeyEvent.VK_E);
JMenuItem aboutMenuItem = new JMenuItem("关于..", KeyEvent.VK_A);
fileMenu.add(printMenuItem);
fileMenu.add(delFileMenuItem);
fileMenu.add(exitMenuItem);
fileMenu.add(aboutMenuItem);
this.add(fileMenu);
aboutDialog = new JDialog();
initAboutDialog();
printMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
byte b[]=new byte[100000];
RandomAccessFile raf1= null;
try {
raf1=new RandomAccessFile("D:\\dt900\\up\\DULP1.TXT","r");
raf1.read(b);
} catch (FileNotFoundException e1) {
JOptionPane.showMessageDialog(null, "文件不存在,请先用采集器扫描后再打印!", "打印失败", JOptionPane.ERROR_MESSAGE);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String s = new String(b);
String str[]=s.split(" ");
List<String> list = new ArrayList<String>();
for (int i = 0; i < str.length-1; i++) {
//System.out.println(str[i]+"--"+i);
list.add(str[i]);
}
// for (int i = 0; i < list.size(); i++) {
// System.out.println("list:"+list.get(i)+"--"+i);
// }
// System.out.println("list:"+list.size());
if(list.size()==0) System.exit(0);
test(list);
try {
raf1.close();
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "文件关闭错误,请重启程序!", "错误", JOptionPane.ERROR_MESSAGE);
}
}
});
delFileMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//Icon icon = new
//JOptionPane.showConfirmDialog(null, "确认要删除采集器扫描的条码文件吗?", "文件删除确认", JOptionPane.YES_NO_OPTION);
int delresult = JOptionPane.showConfirmDialog(null, "确认要删除采集器扫描的条码文件吗,删除后将不能打印扫描的条码?", "文件删除确认", JOptionPane.YES_NO_OPTION);
//System.out.println("delresult:"+delresult);
if(delresult==0)
{
//删除文件
String filePath = "D:\\dt900\\up\\DULP1.TXT";
File file = new File(filePath);
if (!file.exists()) {
JOptionPane.showMessageDialog(null, "文件不存在!", "删除失败", JOptionPane.ERROR_MESSAGE);
return;
}
else
{
boolean rs = file.delete();
if (rs)
JOptionPane.showMessageDialog(null, "文件删除成功!", "删除成功", JOptionPane.ERROR_MESSAGE);
else
JOptionPane.showMessageDialog(null, "文件删除失败!", "删除失败", JOptionPane.ERROR_MESSAGE);
}
}
}
});
exitMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
System.exit(0);
}
});
aboutMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aboutDialog.show();
}
});
}
public JDialog get() {
return aboutDialog;
}
public void initAboutDialog() {
aboutDialog.setTitle("关于");
Container con = aboutDialog.getContentPane();
Icon icon = new ImageIcon("sdmile.gif");
JLabel aboutLabel = new JLabel("" + "赛轮条码打印 V2.1" + "", icon,
JLabel.CENTER);
con.add(aboutLabel, BorderLayout.CENTER);
aboutDialog.setSize(200, 100);
aboutDialog.setLocation(450, 450);
aboutDialog.addWindowListener(new WindowAdapter() {
public void WindowClosing(WindowEvent e) {
dispose();
}
});
}
}
public void test(List<String> listCode) {
try {
DocFlavor flavor = DocFlavor.INPUT_STREAM.JPEG;
// get a printer
PrintService[] printers = PrintServiceLookup.lookupPrintServices(
flavor, null);
//PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
int k=0;
for (int i = 0; i < printers.length; i++)
{
//System.out.println(printers[i].getName());
if("EasyCoder PD42 (300 dpi) - DP".equals(printers[i].getName()))
k=i;
}
// PrintService printer = ServiceUI.printDialog(null, 100, 100, printers, printers[k], flavor, attributes);
PrintService printer = printers[k];
// document
ByteArrayOutputStream output = new ByteArrayOutputStream();
/
BufferedImage bufferedimage_temp = null;
BufferedImage bufferedimage = null;
AffineTransformOp bio = new AffineTransformOp(new AffineTransform(),AffineTransformOp.TYPE_BICUBIC);
BufferedImage bufferedimage3 = null;
Graphics2D graphics2d3 = null;
int codeIndex = 0;
int codeLength = listCode.size();
int oneWei = 1;
if(codeLength>=8)
{
if(codeLength%8==0)
oneWei = codeLength/8;
else
oneWei = codeLength/8+1;
}
BarCode barcode[][] = new BarCode[oneWei][8]; //注意一维需要动态指定
for(int j=0;j<barcode.length;j++)
{
//System.out.println("外层循环值为:"+j);
for(int i=0;i<barcode[j].length;i++)
{
//System.out.println("外层循环值为:"+j+"内层循环值为:"+i);
barcode[j][i] = new BarCode();
if(codeIndex<listCode.size())
barcode[j][i].code = listCode.get(codeIndex++);
else
{
//System.out.println("list循环完毕,break 二层for循环!");
break;
}
barcode[j][i].barType = BarCode.CODE128;
barcode[j][i].barHeightCM=0.8;
// System.out.println("高度:"+barcode[j][i].getBarHeightCM());
// Font font = new Font(null,Font.PLAIN,40);
// barcode[j][i].setFont(font);
barcode[j][i].setSize(barcode[j][i].width, barcode[j][i].height);
// barcode[j][i].width=50;
//则采用自动适应条码的尺寸
bufferedimage_temp = new BufferedImage(barcode[j][i].getSize().width, barcode[j][i].getSize().height, BufferedImage.TYPE_BYTE_INDEXED);
Graphics2D graphics2d_temp = bufferedimage_temp.createGraphics();
barcode[j][i].paint(graphics2d_temp);
barcode[j][i].invalidate();
graphics2d_temp.dispose();
//格式化图片格式为jpeg
bufferedimage = new BufferedImage(barcode[j][i].getSize().width, barcode[j][i].getSize().height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2d = bufferedimage.createGraphics();
barcode[j][i].paint(graphics2d);
if(i==0)
{
bufferedimage3 = new BufferedImage(barcode[j][0].getSize().width,barcode[j][0].getSize().height*8, BufferedImage.TYPE_INT_RGB);
graphics2d3 = bufferedimage3.createGraphics();
}
graphics2d3.drawImage(bufferedimage, bio, 0, barcode[j][i].getSize().height*i);
// graphics2d3.drawImage(bufferedimage2, bio,0,barcode.getSize().height);
}
Image img=bufferedimage3.getScaledInstance(barcode[0][0].getSize().width*2, barcode[0][0].getSize().height*8, Image.SCALE_DEFAULT);
BufferedImage tag = new BufferedImage(225, 460, BufferedImage.TYPE_INT_RGB); //缩放图像
Graphics g = tag.getGraphics();
g.drawImage(img, 0, 0, null); // 绘制缩小后的图
g.dispose();
//合成图片
graphics2d3.dispose();
//System.out.println("合成图片宽度为:"+bufferedimage3.getWidth()+"合成图片高度为:"+bufferedimage3.getHeight());
JPEGImageEncoder jpegimageencoder = JPEGCodec.createJPEGEncoder(output);
JPEGEncodeParam jpegencodeparam = jpegimageencoder.getDefaultJPEGEncodeParam(tag);
jpegencodeparam.setQuality(1.0F, true);
jpegimageencoder.setJPEGEncodeParam(jpegencodeparam);
jpegimageencoder.encode(tag, jpegencodeparam);
output.flush();
//output.close();
ImageIO.write(tag, "jpg", output);
byte[] buf = output.toByteArray();
InputStream stream = new ByteArrayInputStream(buf);
Doc doc = new SimpleDoc(stream, flavor, null);
//设置打印属性
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
DocAttributeSet das = new HashDocAttributeSet();
MediaPrintableArea mpa= new MediaPrintableArea(0.0f, 0.0f, 70.0f, 95.0f, MediaPrintableArea.MM);
das.add(mpa);
das.add(PrintQuality.HIGH);
// das.add(Sides.ONE_SIDED);
//das.add(OrientationRequested.LANDSCAPE);
pras.addAll(das);
//
// print
// job
DocPrintJob job = printer.createPrintJob();
job.print(doc, pras);
output = new ByteArrayOutputStream();
}
// output.close();
//
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "打印错误,请连接打印机并重启程序后打印!", "打印错误", JOptionPane.ERROR_MESSAGE);
}
}
public static void main(String args[]) {
new SaiLunPrint();
}
}