/* * Copyright (C) 2013 The Android Open Source Project * * 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 android.print.pdf; import android.content.Context; import android.graphics.Rect; import android.graphics.pdf.PdfDocument; import android.graphics.pdf.PdfDocument.Page; import android.graphics.pdf.PdfDocument.PageInfo; import android.print.PrintAttributes; import android.print.PrintAttributes.Margins; import android.print.PrintAttributes.MediaSize; /** * This class is a helper for creating a PDF file for given print * attributes. It is useful for implementing printing via the native * Android graphics APIs. * <p> * This class computes the page width, page height, and content rectangle * from the provided print attributes and these precomputed values can be * accessed via {@link #getPageWidth()}, {@link #getPageHeight()}, and * {@link #getPageContentRect()}, respectively. The {@link #startPage(int)} * methods creates pages whose {@link PageInfo} is initialized with the * precomputed values for width, height, and content rectangle. * <p> * A typical use of the APIs looks like this: * </p> * <pre> * // open a new document * PrintedPdfDocument document = new PrintedPdfDocument(context, * printAttributes); * * // start a page * Page page = document.startPage(0); * * // draw something on the page * View content = getContentView(); * content.draw(page.getCanvas()); * * // finish the page * document.finishPage(page); * . . . * // add more pages * . . . * // write the document content * document.writeTo(getOutputStream()); * * //close the document * document.close(); * </pre> */ public class PrintedPdfDocument extends PdfDocument { private static final int MILS_PER_INCH = 1000; private static final int POINTS_IN_INCH = 72; private final int mPageWidth; private final int mPageHeight; private final Rect mContentRect; /** * Creates a new document. * <p> * <strong>Note:</strong> You must close the document after you are * done by calling {@link #close()}. * </p> * * @param context Context instance for accessing resources. * @param attributes The print attributes. */ public PrintedPdfDocument(Context context, PrintAttributes attributes) { MediaSize mediaSize = attributes.getMediaSize(); // Compute the size of the target canvas from the attributes. mPageWidth = (int) (((float) mediaSize.getWidthMils() / MILS_PER_INCH) * POINTS_IN_INCH); mPageHeight = (int) (((float) mediaSize.getHeightMils() / MILS_PER_INCH) * POINTS_IN_INCH); // Compute the content size from the attributes. Margins minMargins = attributes.getMinMargins(); final int marginLeft = (int) (((float) minMargins.getLeftMils() / MILS_PER_INCH) * POINTS_IN_INCH); final int marginTop = (int) (((float) minMargins.getTopMils() / MILS_PER_INCH) * POINTS_IN_INCH); final int marginRight = (int) (((float) minMargins.getRightMils() / MILS_PER_INCH) * POINTS_IN_INCH); final int marginBottom = (int) (((float) minMargins.getBottomMils() / MILS_PER_INCH) * POINTS_IN_INCH); mContentRect = new Rect(marginLeft, marginTop, mPageWidth - marginRight, mPageHeight - marginBottom); } /** * Starts a new page. The page is created using width, height and content * rectangle computed from the print attributes passed in the constructor * and the given page number to create an appropriate {@link PageInfo}. * <p> * After the page is created you can draw arbitrary content on the page's * canvas which you can get by calling {@link Page#getCanvas() Page.getCanvas()}. * After you are done drawing the content you should finish the page by calling * {@link #finishPage(Page)}. After the page is finished you should no longer * access the page or its canvas. * </p> * <p> * <strong>Note:</strong> Do not call this method after {@link #close()}. * Also do not call this method if the last page returned by this method * is not finished by calling {@link #finishPage(Page)}. * </p> * * @param pageNumber The page number. Must be a positive value. * @return A blank page. * * @see #finishPage(Page) */ public Page startPage(int pageNumber) { PageInfo pageInfo = new PageInfo .Builder(mPageWidth, mPageHeight, pageNumber) .setContentRect(mContentRect) .create(); return startPage(pageInfo); } /** * Gets the page width. * * @return The page width in PostScript points (1/72th of an inch). */ public int getPageWidth() { return mPageWidth; } /** * Gets the page height. * * @return The page height in PostScript points (1/72th of an inch). */ public int getPageHeight() { return mPageHeight; } /** * Gets the content rectangle. This is the area of the page that * contains printed data and is relative to the page top left. * * @return The content rectangle. */ public Rect getPageContentRect() { return mContentRect; } }