
实际场景需求 :网页端 自定义打印模板 可以在固定打印机打印还可以在 手机蓝牙打印机打印
最终实现方法:使用pdf文件作为最终打印模板
佳博蓝牙打印机 打印pdf文件想了很多方法~~~~
安卓代码
下面是实现佳博蓝牙打印机 打印pdf文件的具体源码
//demo 样式
void sendLabel() {
LabelCommand tsc = new LabelCommand();
tsc.addSize(60, 60); // 设置标签尺寸,按照实际尺寸设置
tsc.addGap(0); // 设置标签间隙,按照实际尺寸设置,如果为无间隙纸则设置为0
tsc.addDirection(DIRECTION.BACKWARD, MIRROR.NORMAL);// 设置打印方向
tsc.addReference(0, 0);// 设置原点坐标
tsc.addTear(ENABLE.ON); // 撕纸模式开启
tsc.addCls();// 清除打印缓冲区
// 绘制简体中文
//tsc.addText(20, 20, FONTTYPE.SIMPLIFIED_CHINESE, ROTATION.ROTATION_0, FONTMUL.MUL_1, FONTMUL.MUL_1, "Welcome "
// + "to use Gprinter!");
// 绘制图片
//Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.gprinter);
System.out.println("路径:"+ MainActivity.this.getExternalFilesDir(Environment.getDataDirectory().getAbsolutePath()).getAbsolutePath());
Bitmap b = null;
File file = new File(MainActivity.this.getExternalFilesDir(Environment.getDataDirectory().getAbsolutePath()).getAbsolutePath()+"/1.pdf");
if (file!=null) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY));
final int pageCount = renderer.getPageCount();
Log.e("test_sign", "图片de 张数: " + pageCount);
for (int i = 0; i < pageCount; i++) {
PdfRenderer.Page page = renderer.openPage(i);
int width = getResources().getDisplayMetrics().densityDpi / 72 * page.getWidth();
int height = getResources().getDisplayMetrics().densityDpi / 72 * page.getHeight();
b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
//todo 以下三行处理图片存储到本地出现黑屏的问题,这个涉及到背景问题
Canvas canvas = new Canvas(b);
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(b, 0, 0, null);
Rect r = new Rect(0, 0, width, height);
page.render(b, r, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
// close the page
page.close();
}
// close the renderer
renderer.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
tsc.addBitmap(120, 0, BITMAP_MODE.OVERWRITE, 360, b);
//tsc.addQRCode(250, 80, EEC.LEVEL_L, 5, ROTATION.ROTATION_0, " www.gprinter.com.cn");
// 绘制一维条码
//tsc.add1DBarcode(20, 250, BARCODETYPE.CODE128, 100, READABEL.EANBEL, ROTATION.ROTATION_0, "Gprinter");
tsc.addPrint(1, 1); // 打印标签
tsc.addSound(2, 100); // 打印标签后 蜂鸣器响
tsc.addCashdrwer(LabelCommand.FOOT.F5, 255, 255);
Vector<Byte> datas = tsc.getCommand(); // 发送数据
byte[] bytes = GpUtils.ByteTo_byte(datas);
String str = Base64.encodeToString(bytes, Base64.DEFAULT);
int rel;
try {
rel = mGpService.sendLabelCommand(mPrinterIndex, str);
GpCom.ERROR_CODE r = GpCom.ERROR_CODE.values()[rel];
if (r != GpCom.ERROR_CODE.SUCCESS) {
Toast.makeText(getApplicationContext(), GpCom.getErrorText(r), Toast.LENGTH_SHORT).show();
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
}主要代码块:
//引入pdf文件
File file = new File(MainActivity.this.getExternalFilesDir(Environment.getDataDirectory().getAbsolutePath()).getAbsolutePath()+"/1.pdf");
//pdf文件转成图片数据
b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
//图片数据转换打印机可识别的数据格式
tsc.addBitmap(120, 0, BITMAP_MODE.OVERWRITE, 360, b);
本文为程序员之家原创文章,转载无需和我联系,但请注明来自程序员之家www.baldhome.cn
