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);
}
}
// }
}