首页 > 解决方案 > 使用热敏打印机 android 打印 pdf/图像文件

问题描述

我正在尝试使用存储在手机本地存储中的热敏打印机打印图像。但它正在打印一个非常小的图像。谁能建议我如何通过热敏打印机(以太网)打印图像

代码:MainActivity.java:

public class MainActivity extends Activity {
 Socket socket = null;
 RelativeLayout relativeLayout;
  String htmlDocument;
  private WebView myWebView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myWebView =(WebView)findViewById(R.id.myWebView);
        relativeLayout = (RelativeLayout) findViewById(R.id.print);
        htmlDocument = "<html><body><h2>Basic HTML Table</h2><table style=\"width:30%\"><tr><th>Firstname</th><th>Lastname</th><th>Age</th></tr><tr><td>Jill</td><td>Smith</td><td>50</td></tr><tr><td>Eve</td><td>Jackson</td><td>94</td></tr><tr><td>John</td><td>Doe</td><td>80</td></tr></table></body></html>";
        myWebView.loadData(htmlDocument, "text/HTML", "UTF-8");

        new Timer().schedule(new TimerTask() {
            @RequiresApi(api = Build.VERSION_CODES.KITKAT)
            @Override
            public void run() {
                laytooimag();
                // this code will be executed after 2 seconds
            }
        }, 5000);
    }
 public void laytooimag() {
        relativeLayout.setDrawingCacheEnabled(true);
        relativeLayout.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        relativeLayout.layout(0, 0, relativeLayout.getMeasuredWidth(), relativeLayout.getMeasuredHeight());
        relativeLayout.buildDrawingCache();
        Bitmap bm = Bitmap.createBitmap(relativeLayout.getDrawingCache());
        relativeLayout.setDrawingCacheEnabled(false);
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("image/jpeg");
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

        File f = new File(Environment.getExternalStorageDirectory() + File.separator + "image.jpg");
        Log.v("Tag_file",""+f);
        try {
            f.createNewFile();
            FileOutputStream fo = new FileOutputStream(f);
            fo.write(bytes.toByteArray());
        } catch (IOException e) {
            e.printStackTrace();
        }
        new EthernetPrint()
                .execute(resultdata);
    }
    private class EthernetPrint extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {

            try {
                resultdata = params[0];
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {

                    e.printStackTrace();
                }

                // socket = new Socket(r.printerDetails.ipAddress, r.printerDetails.port);
                socket = new Socket("192.168.1.23", 9100);
                DataOutputStream DOS = new DataOutputStream(socket.getOutputStream());
                byte[] printformat = new byte[]{0x1B, 0x21, 0x03};
                DOS.write(printformat);
                Printerinterface bb = new Printerinterface(getApplicationContext(), "Ethernet", null, DOS);
                Log.v("Tag_d",""+"ethdoin");
                printKot_invoice(bb);
                resultdata = "Executed";
                DOS.flush();
                DOS.close();
                socket.close();
            } catch (IOException e) {
                resultdata = "";
                e.printStackTrace();
            }
            return resultdata;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
        }

        @Override
        protected void onPreExecute() {

        }

        @Override
        protected void onProgressUpdate(Void... values) {

            //printKot_invoice();
        }

        public void printKot_invoice(Printerinterface bb) {
            bb.printPhoto(R.drawable.testimg);
        }
}

打印机接口.java:

public class Printerinterface {
 public void printPhoto(int img) {

        try {
            File image = new File(Environment.getExternalStorageDirectory() + File.separator + "image.jpg");
            Bitmap bitmap =  decodeFile(image,100,100);
            if(bitmap!=null){
                byte[] command = Utils.decodeBitmap(bitmap);

               _outputstream().write(PrinterCommands.ESC_ALIGN_CENTER);
               printText(command);
            }else{
                Log.e("Print Photo error", "the file isn't exists");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("PrintTools", "the file isn't exists");
        }
    }

    public static Bitmap decodeFile(File f,int WIDTH,int HIGHT){
        try {
            //Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f),null,o);

            //The new size we want to scale to000
            final int REQUIRED_WIDTH=WIDTH;
            final int REQUIRED_HIGHT=HIGHT;
            //Find the correct scale value. It should be the power of 2.
            int scale=1;
            while(o.outWidth/scale/2>=REQUIRED_WIDTH && o.outHeight/scale/2>=REQUIRED_HIGHT)
                scale*=2;

            //Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize=scale;
            return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        }
        catch (FileNotFoundException e) {}
        return null;
    }
}

如果我没有解码图像,则会显示图像宽度和高度很大的错误。

标签: androidethernetthermal-printer

解决方案


推荐阅读