想知道如何将图像添加到画布并同时打印图像和画布

时间:2019-12-19 02:45:57

标签: java android image canvas printing

Good Day All

仍在学习:)

我有一个将文本发送到画布,然后打印画布的应用程序。文本部分工作正常,但我不知道如何将位图图像写入同一画布并打印。

我要打印的图像来自文件,并且我知道文件路径已正确发送到打印功能,因为我可以在ImageView的屏幕上显示图像。这是使用名为“ imagepath”的变量完成的。

但是,当我尝试使用以下代码编写位图BitmapFactory时,它将无法打印。
位图位图= BitmapFactory.decodeFile(imagepath);

我的打印Java文件在下面...

package com.safetycheckconsulting.confinedspacemanagement;


import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.pdf.PdfDocument;
import android.net.Uri;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.ParcelFileDescriptor;
import android.print.PageRange;
import android.print.PrintAttributes;
import android.print.PrintDocumentAdapter;
import android.print.PrintDocumentInfo;
import android.print.PrintManager;
import android.print.pdf.PrintedPdfDocument;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;

import java.io.FileOutputStream;
import java.io.IOException;


public class PrintActivity extends Activity {
    EditText printtext;
ImageView PrintPic;
    Bitmap bitmap;
    Button printMe;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_print);
        printtext = findViewById(R.id.edittexttoprint);
        Intent intent = getIntent();
        Bundle b = intent.getBundleExtra("Print_Input");
            String print_input = b.getString("information");
            String imagepath = b.getString("imagepathuri");
        printtext.setText(print_input + "\n\n");
       Bitmap bitmap = BitmapFactory.decodeFile(imagepath);
PrintPic = findViewById(R.id.printimage);
PrintPic.setImageURI(Uri.parse(imagepath));
        printMe = findViewById(R.id.create);
       printMe.performClick();
    }

    public void printDocument(View view)
    {
        PrintManager printManager = (PrintManager) this
                .getSystemService(Context.PRINT_SERVICE);

        String jobName = this.getString(R.string.app_name) +
                " Document";

        printManager.print(jobName, new MyPrintDocumentAdapter(this),
                null);
    }

    public class MyPrintDocumentAdapter extends PrintDocumentAdapter {
        Context context;
        private int pageHeight;
        private int pageWidth;
        public PdfDocument myPdfDocument;
        public int totalpages = 1;

        public MyPrintDocumentAdapter(Context context) {
            this.context = context;
        }

        @Override
        public void onLayout(PrintAttributes oldAttributes,
                             PrintAttributes newAttributes,
                             CancellationSignal cancellationSignal,
                             LayoutResultCallback callback,
                             Bundle metadata) {
            myPdfDocument = new PrintedPdfDocument(context, newAttributes);

            pageHeight =
                    newAttributes.getMediaSize().getHeightMils() / 1000 * 72;
            pageWidth =
                    newAttributes.getMediaSize().getWidthMils() / 1000 * 72;

            if (cancellationSignal.isCanceled()) {
                callback.onLayoutCancelled();
                return;
            }

            if (totalpages > 0) {
                PrintDocumentInfo.Builder builder = new PrintDocumentInfo
                        .Builder("print_output.pdf")
                        .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
                        .setPageCount(totalpages);

                PrintDocumentInfo info = builder.build();
                callback.onLayoutFinished(info, true);
            } else {
                callback.onLayoutFailed("Page count is zero.");
            }
        }


        @Override
        public void onWrite(final PageRange[] pageRanges,
                            final ParcelFileDescriptor destination,
                            final CancellationSignal cancellationSignal,
                            final WriteResultCallback callback) {
            for (int i = 0; i < totalpages; i++) {
                if (pageInRange(pageRanges, i)) {
                    PdfDocument.PageInfo newPage = new PdfDocument.PageInfo.Builder(pageWidth,
                            pageHeight, i).create();

                    PdfDocument.Page page =
                            myPdfDocument.startPage(newPage);

                    if (cancellationSignal.isCanceled()) {
                        callback.onWriteCancelled();
                        myPdfDocument.close();
                        myPdfDocument = null;
                        return;
                    }
                    drawPage(page, i);
                    myPdfDocument.finishPage(page);
                }
            }

            try {
                myPdfDocument.writeTo(new FileOutputStream(
                        destination.getFileDescriptor()));
            } catch (IOException e) {
                callback.onWriteFailed(e.toString());
                return;
            } finally {
                myPdfDocument.close();
                myPdfDocument = null;
            }

            callback.onWriteFinished(pageRanges);
        }

        private boolean pageInRange(PageRange[] pageRanges, int page) {
            for (int i = 0; i < pageRanges.length; i++) {
                if ((page >= pageRanges[i].getStart()) &&
                        (page <= pageRanges[i].getEnd()))
                    return true;
            }
            return false;
        }

        private void drawPage(PdfDocument.Page page, int pagenumber) {
            Canvas canvas = page.getCanvas();

            pagenumber++; // Make sure page numbers start at 1

            int titleBaseLine = 55;
            int leftMargin = 60;

            Paint paint = new Paint();
            paint.setColor(Color.BLACK);
            paint.setTextSize(28);

//                 canvas.drawText(
//                         "Confined Space Management - Page " + pagenumber,
//                         leftMargin,
//                         titleBaseLine,
//                         paint);

            paint.setTextSize(12);
            int textwidth = 560;

            String text = printtext.getText().toString() + "\n\n" ;

            TextPaint textPaint = new TextPaint();

            textPaint.setAntiAlias(true);
            textPaint.setTextSize(4 * getResources().getDisplayMetrics().density);
            textPaint.setColor(0xFF000000);

            int width = (int) textPaint.measureText(text);
            StaticLayout staticLayout = new StaticLayout(text, textPaint, textwidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 1, true);
            staticLayout.draw(canvas);

            int textHeight = staticLayout.getHeight();

            // get position of text's top left corner
            float x = (staticLayout.getWidth() - textwidth) / 2;
            float y = (staticLayout.getHeight() - textHeight) / 2;

            // draw text to the Canvas center
            canvas.save();
            canvas.translate(x, y);

//                canvas.drawText("Confined Space Management " + printtext.getText().toString(), leftMargin, titleBaseLine + 35, paint);
//            if (!printimage.equals("first")) {
                if (pagenumber % 2 == 0)
                    paint.setColor(Color.RED);
                else
                    paint.setColor(Color.GREEN);

                PdfDocument.PageInfo pageInfo = page.getInfo();
// use printimage to pass image url

canvas.drawBitmap(bitmap,10,10,paint);

//                canvas.drawCircle(450,
//                        100,
//                        75,
//                        paint);
            }

        }
//    }
    }

0 个答案:

没有答案