/* * Copyright (C) 2013 Toshihiro Yagi. https://github.com/sys1yagi * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jp.mydns.sys1yagi.android.printingframeworksample.custom; import java.io.FileOutputStream; import java.io.IOException; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.pdf.PdfDocument; import android.os.Bundle; import android.os.CancellationSignal; import android.print.PrintAttributes; import android.print.PrintDocumentAdapter; import android.print.PrintDocumentInfo; import android.print.pdf.PrintedPdfDocument; import android.util.Log; /** * @author yagitoshihiro * */ public class CustomDocumentPrintAdapter extends PrintDocumentAdapter { private Paint mPaint = new Paint(); private Context mContext; private Bitmap mBitmap; private String mTitle; private String mMessage; PrintedPdfDocument mPdfDocument; public CustomDocumentPrintAdapter(Context context, Bitmap bitmap, String title, String message) { mContext = context; mBitmap = bitmap; mTitle = title; mMessage = message; } @Override public void onStart() { super.onStart(); } @Override public void onFinish() { super.onFinish(); }; @Override public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) { mPdfDocument = new PrintedPdfDocument(mContext, newAttributes); if (cancellationSignal.isCanceled()) { callback.onLayoutCancelled(); return; } int pages = 1; // newAttributes.getColorMode(); // newAttributes.getMediaSize().getHeightMils(); // newAttributes.getMediaSize().getWidthMils(); PrintDocumentInfo info = new PrintDocumentInfo.Builder("androids.pdf") .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) .setPageCount(pages).build(); callback.onLayoutFinished(info, true); } @Override public void onWrite(android.print.PageRange[] pages, android.os.ParcelFileDescriptor destination, CancellationSignal cancellationSignal, WriteResultCallback callback) { if (mPdfDocument == null) { Log.e("print", "error mPdfDocument is null."); return; } PdfDocument.Page page = mPdfDocument.startPage(0); if (cancellationSignal.isCanceled()) { callback.onWriteCancelled(); mPdfDocument.close(); mPdfDocument = null; return; } onDraw(page.getCanvas()); mPdfDocument.finishPage(page); try { mPdfDocument.writeTo(new FileOutputStream(destination .getFileDescriptor())); } catch (IOException e) { callback.onWriteFailed(e.toString()); return; } finally { mPdfDocument.close(); mPdfDocument = null; } callback.onWriteFinished(pages); }; public void onDraw(Canvas canvas) { mPaint.setTextSize(30); mPaint.setColor(Color.GRAY); int offsetX = 50; int offsetY = 20; canvas.drawText("Hello DocumentPrintAdapter", offsetX, offsetY - mPaint.getFontMetrics().top, mPaint); offsetY += (-mPaint.getFontMetrics().top); offsetY += 40; // margin if (mBitmap != null) { printBitmapCenterX(canvas, offsetY, mBitmap, mPaint); offsetY += mBitmap.getHeight(); } mPaint.setColor(Color.BLACK); mPaint.setTextSize(45); printTextCenterX(canvas, offsetY, mTitle, mPaint); offsetY += (-mPaint.getFontMetrics().top); offsetY += 20; // margin mPaint.setTextSize(24); int paddingX = offsetX; if (mBitmap != null) { paddingX = canvas.getWidth() / 2 - mBitmap.getWidth() / 2; } printWrapText(canvas, mMessage, paddingX, offsetY, 18, mPaint); } private void printBitmapCenterX(Canvas canvas, int offsetY, Bitmap bitmap, Paint paint) { canvas.drawBitmap(bitmap, canvas.getWidth() / 2 - bitmap.getWidth() / 2, offsetY, paint); } private void printTextCenterX(Canvas canvas, int offsetY, String text, Paint paint) { float[] widths = new float[text.length()]; paint.getTextWidths(text, widths); int width = 0; for (float w : widths) { width += w; } int offsetX = canvas.getWidth() / 2 - width / 2; canvas.drawText(text, offsetX, offsetY - paint.getFontMetrics().top, paint); } private int printWrapText(Canvas canvas, String text, int paddingX, int startY, int lineSpace, Paint paint) { int renderWidth = canvas.getWidth() - paddingX * 2; int textHeight = -(int) paint.getFontMetrics().top; int width = 0; char[] c = new char[1]; float[] w = new float[1]; int index = 0; for (int i = 0; i < text.length(); i++) { c[0] = text.charAt(i); paint.getTextWidths(c, 0, 1, w); if (width + w[0] > renderWidth) { canvas.drawText(text.substring(index, i), paddingX, startY + textHeight, paint); startY += textHeight + lineSpace; index = i; width = 0; } else { width += w[0]; } if (i + 1 >= text.length()) { // render if (index != i) { canvas.drawText(text.substring(index, i + 1), paddingX, startY + textHeight, paint); startY += textHeight + lineSpace; } } } return startY; } }