打码机:扫码,生成打印自定义标签
一、Android
打印机要支持,网络、WiFi ;手机与打印机在同一网络下才行,本文用WiFi连接
打开系统打印服务: 设置--更多设置--打印--选择默认打印服务(或者应用商城下载 Mopria Print Service )--开启
1、使用系统打印机打印图片:
/**系统打印机--打印图片*/
private void doPrintPictures(Bitmap bitmap) {
PrintHelper photoPrinter = new PrintHelper(this);
photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT);
// Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.droids); //本地图片
photoPrinter.printBitmap("droids.jpg - test print", bitmap);
}
2、打印自定义标签
将需要打印的内容,图片,文字 通过水印方式添加入一张图片中,再调用系统打印服务,打印出来
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1111) {
if (data != null) {
content = data.getStringExtra(Constant.CODED_CONTENT);
Log.i("扫描结果为:", content);
scanFragment.onActivityResult(requestCode, resultCode, data);
//生成的二维码
Bitmap bitmap = CodeCreator.createQRCode(content, 300, 300, null);
if (bitmap != null) {
//将内容水印方式生成一张图片
Bitmap waterMark = AddWatermark(bitmap);
contentIv.setImageBitmap(waterMark);
//保存入本地
QRCodeUtil.saveImageToGallery(getApplicationContext(), waterMark);
//打印 图片
doPrintPictures(waterMark);
}
}
}
}
3、AddWatermark
/**
* 添加水印
*
* @param mBitmap
* @return mNewBitmap
*/
private Bitmap AddWatermark(Bitmap mBitmap) {
//获取原始图片与水印图片的宽与高
int mBitmapWidth = mBitmap.getWidth();
int mBitmapHeight = mBitmap.getHeight();
//定义底片 大小
Bitmap mNewBitmap = Bitmap.createBitmap(800, 600, Bitmap.Config.ARGB_8888);
//原始图片--底片
Canvas mCanvas = new Canvas(mNewBitmap);
//向位图中开始画入MBitmap图片 二维码在底片中的位置
// mCanvas.drawBitmap(mBitmap,0,0,null);
mCanvas.drawBitmap(mBitmap, 80, 150, null);
//添加文字
Paint mPaint = new Paint();
mPaint.setColor(Color.BLACK);
mPaint.setTextSize(25);
//true为粗体,false为非粗体
mPaint.setFakeBoldText(true);
//字体
String mTitl = "Title";
String mNam = "Name";
String mP = "P:1234567";
String mT = "T:2020061916";
String mV = "V:23563";
String mS = "S:1025698736125";
String mMdae = "MADE IN CHINA";
//根据底片大小--->水印的位置坐标
mCanvas.drawText(mTitl, 80, 130, mPaint);
mCanvas.drawText(mNam, 400, 130, mPaint);
mCanvas.drawText(mP, 400, (mBitmapHeight / 4) + 150, mPaint);
mCanvas.drawText(mT, 400, (mBitmapHeight / 3) + 170, mPaint);
mCanvas.drawText(mV, 400, (mBitmapHeight / 2) + 160, mPaint);
mCanvas.drawText(mS, 400, (mBitmapHeight / 1) + 150, mPaint);
mCanvas.drawText(mMdae, 100, 480, mPaint);
mCanvas.save();
mCanvas.restore();
return mNewBitmap;
}
4、系统打印:doPrintPictures
/**
* 系统打印机--打印图片
*/
private void doPrintPictures(Bitmap bitmap) {
PrintHelper photoPrinter = new PrintHelper(this);
photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT);
// Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.droids); //本地图片
photoPrinter.printBitmap("droids.jpg - test print", bitmap);
}
5、保存图片
/**
* 将二维码图片保存到文件夹
*
* @param context
* @param bmp
*/
public static void saveImageToGallery(Context context, Bitmap bmp) {
// 首先保存图片
String externalStorageState = Environment.getExternalStorageState();
//判断sd卡是否挂载
if (externalStorageState.equals(Environment.MEDIA_MOUNTED)) {
/*外部存储可用,则保存到外部存储*/
//创建一个文件夹
File appDir = new File(Environment.getExternalStorageDirectory(), "Pictures");
//如果文件夹不存在
if (!appDir.exists()) {
//则创建这个文件夹
appDir.mkdir();
}
//将bitmap保存
saveImage(context, bmp, appDir);
} else {
//外部不可用,将图片保存到内部存储中,获取内部存储文件目录
File filesDir = context.getFilesDir();
//保存
saveImage(context, bmp, filesDir);
}
}
private static void saveImage(Context context, Bitmap bmp, File appDir) {
//命名文件名称
// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");// HH:mm:ss
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(System.currentTimeMillis());
String format = dateFormat.format(date);
String fileName = format + ".jpg";
// String fileName = "扫码知内容" + ".jpg";
//创建图片文件,传入文件夹和文件名
File imagePath = new File(appDir, fileName);
try {
//创建文件输出流,传入图片文件,用于输入bitmap
FileOutputStream fos = new FileOutputStream(imagePath);
//将bitmap压缩成png,并保存到相应的文件夹中
bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
//冲刷流
fos.flush();
//关闭流
fos.close();
Toast.makeText(context,"保存完毕",Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 其次把文件插入到系统图库
try {
MediaStore.Images.Media.insertImage(context.getContentResolver(),
imagePath.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 最后通知图库更新
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + imagePath.getAbsolutePath())));
}
6、关于二维码的生成参考文章:
Android超方便 集成 Zxing实现扫一扫,闪光灯,生成二维码图片,解析二维码(条码)等功能
二、Java
创建Maven项目 pom.xml中依赖 zxing得到 jar,添加入lib中
附上lib下载地址:lib
附上Maven官网:ZXing Core
<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
1、生成二维码工具类
import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Hashtable;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
public class QRCodeUtil {
private static final String CHARSET = "utf-8";
private static final String FORMAT_NAME = "JPG";
// 二维码尺寸
private static final int QRCODE_SIZE = 200;
//嵌入的logo宽度
private static final int WIDTH = 60;
//嵌入的 logo高度
private static final int HEIGHT = 60;
/**
* 创建二维码图片
* @param content 包含的内容
* @param logo 嵌入的logo
* @param compress true or false
* @throws Exception
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
private static BufferedImage createImage(String content, String logo, boolean compress) throws Exception {
Hashtable hashtable = new Hashtable();
hashtable.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hashtable.put(EncodeHintType.CHARACTER_SET, CHARSET);
hashtable.put(EncodeHintType.MARGIN, 1);
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,hashtable);
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
}
}
if (logo == null || "".equals(logo)) {
return image;
}
// 插入图片
QRCodeUtil.insertImage(image, logo, compress);
return image;
}
private static void insertImage(BufferedImage source, String logo, boolean compress) throws Exception {
File file = new File(logo);
if (!file.exists()) {
System.err.println("" + logo + " 该文件不存在!");
return;
}
Image src = ImageIO.read(file);
int width = src.getWidth(null);
int height = src.getHeight(null);
// 压缩LOGO
if (compress) {
if (width > WIDTH) {
width = WIDTH;
}
if (height > HEIGHT) {
height = HEIGHT;
}
Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(image, 0, 0, null); // 绘制缩小后的图
g.dispose();
src = image;
}
// 插入logo
Graphics2D graphics2d = source.createGraphics();
int x = (QRCODE_SIZE - width) / 2;
int y = (QRCODE_SIZE - height) / 2;
graphics2d.drawImage(src, x, y, width, height, null);
Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
graphics2d.setStroke(new BasicStroke(3f));
graphics2d.draw(shape);
graphics2d.dispose();
}
/**
* 创建二维码图片
* @param content 包含的内容
* @param logo 嵌入的logo
* @param destPath 图片生成后的存储路径
* @param compress true or false 压缩
* @throws Exception
*/
public static void CreateQrCode(String content, String logo, String destPath, boolean compress) throws Exception {
BufferedImage image = QRCodeUtil.createImage(content, logo, compress);
mkdirs(destPath);
ImageIO.write(image, FORMAT_NAME, new File(destPath));
}
/* 创建文件路径*/
public static void mkdirs(String destPath) {
File file = new File(destPath);
// 当文件夹不存在时,创建文件
if (!file.exists() && !file.isDirectory()) {
file.mkdirs();
}
}
/**
* 解析二维码包含的内容
* @param Path 图片的存储路径
* @param resultStr 返回解析内容
* @throws Exception
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static String decode(String path) throws Exception {
File file = new File(path);
BufferedImage image = ImageIO.read(file);
if (image == null) {
return null;
}
BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Hashtable hashtable = new Hashtable();
hashtable.put(DecodeHintType.CHARACTER_SET, CHARSET);
Result result = new MultiFormatReader().decode(bitmap, hashtable);
return result.getText().toString();
}
}
2、调用添加水印
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import com.demo.QRCodeUtil;
public class DrawPic {
//字体
private static String mTitl = "Title";
private static String mNam = "Name";
private static String mP = "P:1234567";
private static String mT = "T:2020061916";
private static String mV = "V:23563";
private static String mS = "S:1025698736125";
private static String mMade = "MADE IN CHINA";
public static void main(String[] args) throws Exception {
//创建二维码图片
createQrCodePic();
//得到图片缓冲区 //INT精确度达到一定,RGB三原色,高度440,宽度590
BufferedImage bufferimage = new BufferedImage(590,440,BufferedImage.TYPE_INT_RGB);
//得到它的绘制环境(这张图片的笔)
Graphics2D graphics = (Graphics2D) bufferimage.getGraphics();
//填充一个矩形 左上角坐标(0,0),宽590,高440;填充整张图片 (设置背景)
graphics.fillRect(0,0,590,440);
//设置背景颜色 ---此时生成一张59x44的白底图片,再向其中绘制你想要的图片文字
graphics.setColor(Color.WHITE);
// graphics.setColor(Color.WHITE); //边框颜色
// graphics.drawRect(0,0,590-1,440-1); //画边框
//设置字体:字体、字号、大小
graphics.setFont(new Font("宋体",Font.BOLD,18));
//设置字体颜色
graphics.setColor(Color.BLACK);
//向图片上写字符串
graphics.drawString(mTitl,30,110);
graphics.drawString(mNam,350,110);
graphics.drawString(mP,250,145);
graphics.drawString(mT,250,195);
graphics.drawString(mV,250,245);
graphics.drawString(mS,250,295);
graphics.drawString(mMade,40,340);
// 向图片内印上 二维码图片
ImageIcon imgIcon = new ImageIcon("D:\\qrCode\\qrcode\\qrcode.jpg");
Image image = imgIcon.getImage();
//绘制图片位置
graphics.drawImage(image, 30, 120, null);
//保存图片 JPEG表示保存格式
ImageIO.write(bufferimage,"JPEG",new File("D:\\qrCode\\创建一张白底+二维码水印的.jpg"));
System.out.println("图片创建成功");
}
//创建二维码图片
private static void createQrCodePic() throws Exception{
// TODO Auto-generated method stub
// 存放在二维码中的内容
String text = "This is a QR code";
// 存放的logo路径
String logo = "D:/qrCode/qrcode/logo.jpg";
// 生成的二维码的路径及名称
String destPath = "D:/qrCode/qrcode/qrcode.jpg";
//生成二维码
// QRCodeUtil.CreateQrCode(text, logo, destPath, true);
QRCodeUtil.CreateQrCode(text, null, destPath, true);
// 解析二维码
String str = QRCodeUtil.decode(destPath);
// 打印出解析出的内容
System.out.println(str);
}
}
3、结束