关于web页面JApplet打印小票

时间:2021-10-26 18:24:56

版权所有 http://www.cnblogs.com/yzssoft/p/8991971.html

做这个的例子太少,我把我做的示例亮出来

一.先说说需要的版本

  1.我用的浏览器只有ie:

    火狐只支持52版本以下,并且是java7、java8。chrome不支持 

  2.applet客户端打印,需要java6:

    亲自测试,java6需要一些提示是否运行,等都同意后,打印时不用再提示。

           在java7、8,我自己测试控制面板里面没有低级,只有高级和超高级,不管什么时候打印,它都会提示是否同意

    所以,我最终还是选择了在applet里放入jre6

二.applet的打印代码

  1.html,在ie下才可运行

  因为执行的时候,需要检查有没有jre6、请求/接受路径、一些传递的参数,运行的class、需要的jar,代码如下:

function is_ie(json, print_type) {
//){
//项目的根路径
var req_path = "http://localhost:8080";
//打印机名
var print_name = "Deli DL-888C"; var str = "JRPrinterApplet";
var archive = 'jbarcodebean-1.2.0.jar,json-20160810.jar,print.jar';
var codebase = '/applets'
var file = '/applets/jre-6u45-windows-i586.exe';
var scriptable = false;
var type = 'application/x-java-applet;version=1.6.0';
var clsid = "";
if (isFamilyVersionSupported()) {
clsid = "clsid:CAFEEFAC-0016-0000-FFFF-ABCDEFFEDCBA";
} else {
clsid = "clsid:CAFEEFAC-0016-0000-0008-ABCDEFFEDCBA";
}
var write = '' +
//'<object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" width = "0" height = "0" codebase="'+file+'" mayscript>' +
'<object classid="' + clsid + '" width = "0" height = "0" codebase="' + file + '" mayscript>' +
'<param name = "code" value = "' + str + '.class" >' +
'<param name = "codebase" value = "' + codebase + '" >' +
'<param name = "archive" value = "' + archive + '" >' +
'<param name="type" value="' + type + '">' +
'<param name="scriptable" value="' + scriptable + '">' +
'<param name = "print_type" value ="' + print_type + '">' +
'<param name = "print_name" value ="' + print_name + '">' +
'<param name = "req_path" value ="' + req_path + '">' +
'<param name = "json" value =\'' + json + '\'>' +
'<comment>' +
'<embed type="' + type + '" code="' + str + '.class" java_codebase="' + codebase + '" archive="' + archive + '" scriptable=' + scriptable + ' pluginspage="' + file + '" >' +
'<noembed></noembed>' +
'</embed>' +
'</comment>' +
'</object>';
$("#objectDiv").html(write)
if(print_type=='login_test'){ }
}

  2.jre接受请求

    需要的文件

   aaarticlea/png;base64,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" alt="" />

    (1)JRPrinterApplet.java,太多了,大家慢慢看吧,应该能理解

    

import net.sourceforge.jbarcodebean.JBarcodeBean;
import net.sourceforge.jbarcodebean.model.Code39;
import net.sourceforge.jbarcodebean.model.Ean13;
import org.json.JSONArray;
import org.json.JSONObject; import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.print.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Date; /**
* Created by Administrator on 2018/4/29.
*/
public class JRPrinterApplet extends JApplet implements Printable {
JSONObject jsonObject=new JSONObject();
private int imageWidth = 300; //图片的宽度 @Override
public void init() {
String req_path=this.getParameter("req_path");
String print_type=this.getParameter("print_type");
String print_name=this.getParameter("print_name");
String jsonStr=this.getParameter("json");
//链接测速
if(print_type.equals("login_test")){
System.out.println("****连接测试");
String get=urlGet(req_path+"/print/print_error?type=login_test");
System.out.println(get);
return;
}else if(print_type.equals("print")){
System.out.println("****连接打印");
jsonObject=new JSONObject(jsonStr);
String id=String.valueOf(jsonObject.get("id"));
System.out.println(print_name+" "+req_path+" "+id+" "+print_type+"\n"+jsonStr);
Book book = new Book();
// 设置成竖打
PageFormat pf = new PageFormat();
pf.setOrientation(PageFormat.PORTRAIT); // LANDSCAPE表示竖打;PORTRAIT表示横打;REVERSE_LANDSCAPE表示打印空白
// 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。
Paper p = new Paper();
p.setSize(imageWidth, 300); // 纸张大小(590, 840)表示A4纸
p.setImageableArea(0, 0, imageWidth, 300); // A4(595 X842)设置打印区域,其实0,0应该是72,72
// ,因为A4纸的默认X,Y边距是72
pf.setPaper(p);
// 把 PageFormat 和 Printable 添加到书中,组成一个页面
book.append(this, pf);
// 获取打印服务对象
PrinterJob.lookupPrintServices();
PrinterJob job = PrinterJob.getPrinterJob();
// 设置打印类
job.setPageable(book);
PrintService[] pss = PrintServiceLookup.lookupPrintServices(null,null);
//PrintService ps=null;
boolean have_ps=false;
for(PrintService printService:pss){
System.out.println("****找到打印机:"+printService.toString());
if(printService.toString().contains(print_name)){
try {
System.out.println("----找到对应打印机:"+printService.toString());
job.setPrintService(printService);
have_ps=true;
} catch (PrinterException e) {
String services = urlGet(req_path + "/print/print_error?type=Doc_error&id=" + id + "&msg=" + e);
System.out.println(services);
e.printStackTrace();
return;
}
}
}
if(!have_ps){
String var19 = urlGet(req_path + "/print/print_error?type=print_no_find&id=" + id);
System.out.println(var19);
}else{
try {
// 可以用printDialog显示打印对话框,在用户确认后打印;也可以直接打印
/*boolean a=job.printDialog();
if(a)
{
job.print();
}*/
String get=urlGet(req_path + "/print/print_error?type=print_ok&id=" + id);
System.out.println(get);
job.print();
} catch (PrinterException e) {
String get = urlGet(req_path + "/print/print_error?type=print_is_error&id=" + id + "&msg=" + e);
System.out.println(get);
e.printStackTrace();
}
}
}
}
public int print(Graphics gra, PageFormat pf, int pageIndex) throws PrinterException {
Component c = null;
Graphics2D g2 = (Graphics2D) gra;
double x = pf.getImageableX();
double y = pf.getImageableY();
switch (pageIndex) {
case 0:
g2.drawImage(graphicsGeneration(jsonObject), (int) x, (int) y, c);
return PAGE_EXISTS;
default:
return NO_SUCH_PAGE;
}
} public BufferedImage graphicsGeneration(JSONObject jsonObject) {
String id=String.valueOf(jsonObject.get("id"));
String name=String.valueOf(jsonObject.get("name"));
JSONArray array=jsonObject.getJSONArray("list"); int title_h=20;
int left_long=10;
int row=1;
int i;
int imageHeight=title_h*(row+7)+80;
BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
//设置图片的背景色
Graphics2D main = image.createGraphics();
main.setColor(Color.white);
main.fillRect(0, 0, imageWidth, imageHeight); //***********************页面头部
Graphics g = image.createGraphics();
g.fillRect(0, 0, imageWidth, title_h);
g.setColor(Color.white);
Font font = new Font("宋体", Font.BOLD, 14);
g.setFont(font);
g.setColor(Color.BLACK);
g.drawString("***道口义兴张祥记烧鸡老铺***", 50, title_h*row+++3);
//其他内容
font = new Font("宋体", Font.PLAIN, 12);
g.setFont(font);
g.drawString("单号:"+id,left_long,title_h*row);
g.drawString("时间:"+new SimpleDateFormat("MM月dd日 HH:mm:ss").format(new Date()),imageWidth/2,title_h*row++);
g.drawString("收货人:"+name,left_long,title_h*row++);
g.drawLine(5,65,295,65);
for(i=0;i<array.length();i++){
JSONObject o= (JSONObject) array.get(i);
g.drawString((i+1)+".",left_long,title_h*row);
g.drawString(o.get("name")+" x"+o.get("num"),left_long+15,title_h*row);
String unit="";
if(o.get("unit")!=null&&!o.get("unit").equals("")){
unit="/"+o.get("unit");
}
g.drawString(o.get("money")+unit,240,title_h*row);
row++;
} //生成条维码
JBarcodeBean jBarcodeBean = new JBarcodeBean();
// 条形码类型
//jBarcodeBean.setCodeType(new Ean13());
jBarcodeBean.setCodeType(new Code39());
// 在条形码下面显示文字
jBarcodeBean.setLabelPosition(JBarcodeBean.LABEL_BOTTOM);
jBarcodeBean.setCode(id);
jBarcodeBean.setBarcodeHeight(50);
//条维码
BufferedImage tiao_wei_ma = new BufferedImage(300, 80, BufferedImage.TYPE_INT_RGB);
tiao_wei_ma = jBarcodeBean.draw(tiao_wei_ma); //***********************插入图片
Graphics mainPic = image.getGraphics();
if(tiao_wei_ma!=null){
mainPic.drawImage(tiao_wei_ma,0,title_h*(row-1),null);
mainPic.dispose();
}
//createImage("F:\\temp/hehe.jpg",image);
return image;
} /**
* 向指定URL发送GET方法的请求
*
*/
public static String urlGet(String url) {
BufferedReader in = null;
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
// 建立实际的连接
connection.connect();
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
return sb.toString();
} catch (Exception e) {
System.out.println(e);
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return null;
}
}

      一定要用java6生成class,要不然applet的java6不支持

      (1).将class生成jar,我命名print.jar

      (2).jar -cvf print.jar *.class  (生成jar包),放入applets

     5.签名    

      1.创建一个证书
      keytool -genkey -validity 1800 -keystore applet.store -alias applet  
      2.导出证书文件
      keytool -export -keystore applet.store -alias applet -file applet.cer
      3.对jar包进行签名

      jarsigner -keystore applet.store jbarcodebean-1.2.0.jar applet

      jarsigner -keystore applet.store json-20160810.jar applet

      jarsigner -keystore applet.store print.jar applet

     6.将上面图的那些文件放入applet