android kit kat - printing framework
TRANSCRIPT
Printing Frameworkandroid.print
The gist of it
The gist of it
PrintManager
Prerequisites
SDK platform 19
SDK build-tools 19 or later
Something to print with
A Google Cloud Print Ready printer
A printer shared through Google Cloud Print
Print to PDF
ApiDemos
[sdk]/sampes/android-19/legacy/ApiDemos
PrintManager printManager = (PrintManager) context.getSystemService(Context.PRINT_SERVICE);
PrintJob printJob = printManager.print( printJobName, documentAdapter, attributes);
PrintManager
Name for the print job(shown to the user)
Adapter that emits the document
Default print job attributes
PrintDocumentAdapter documentAdapter =
// Directly from an existing WebView webView.createPrintDocumentAdapter();
PrintDocumentAdapterWeb pages
// Create a WebView and start printing when its readyWebView webView = new WebView(context);
webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished( WebView webView, String url) { // Print to it as before PrintDocumentAdapter documentAdapter = webView.createPrintDocumentAdapter(); }});
webView.loadUrl(url);
PrintDocumentAdapterWeb pages
PrintDocumentAdapter documentAdapter =
// Define a custom print adapter
new MyPrintDocumentAdapter(context);
PrintDocumentAdapterCustom documents
Custom Print Adapters
Events:
onStart()
Print process has begun.
onLayout()
A print setting has changed and the layout of the pages needs to be computed.
Must return expected number of pages.
onWrite()
Render printed pages into a file.
onFinish()
Print process has ended.
Custom Print AdaptersonLayout()
public void onLayout( final PrintAttributes oldAttributes, final PrintAttributes newAttributes, final CancellationSignal cancellationSignal, final LayoutResultCallback callback, final Bundle metadata) {
}
onLayoutFinished( PrintDocumentInfo, boolean)
onLayoutFailed(CharSequence)
onLayoutCancelled()
CONTRACT
Custom Print AdaptersonLayout()
Create a document for printing:
PrintedPdfDocument document = new PrintedPdfDocument(context, newAttributes);
Compute the number of pages using PrintAttributes
Return print information to the print framework:
PrintDocumentInfo info = new PrintDocumentInfo .Builder("print_output.pdf") .setContentType( PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) .setPageCount(pages); .build(); callback.onLayoutFinished(info, true);
Wait for the print framework to invoke onWrite()
Custom Print AdaptersonWrite()
public void onWrite( final PageRange[] pages, final ParcelFileDescriptor destination, final CancellationSignal cancellationSignal, final WriteResultCallback callback) {
}
onWriteFinished(PageRange[])
onWriteFailed(CharSequence)
onWriteCancelled()
CONTRACT
Custom Print AdaptersonWrite()
Start writing a page:
Page page = document.startPage(pageNumber);
Draw onto the page canvas:
page.getCanvas();
Note that elements are specified in points (1/72 inch)
Finish writing the page:
document.finishPage(page);
Inform WriteResultCallback of the PageRange[] printed
Custom Print AdaptersCaveats
If you need a screen context, remember that the printer and screen densities differ!
Obtain the printer density:
printerDensity = Math.max( newAttributes.getResolution().getHorizontalDpi(), newAttributes.getResolution().getVerticalDpi());
Create a new Context to cope with a different Configuration:
Configuration configuration = new Configuration(); configuration.densityDpi = printerDensity; printContext = createConfigurationContext( configuration);
Use this context for creating new views:
View view = new LinearLayout(printContext); view.draw(page.getCanvas());
PrintHelper printHelper = new PrintHelper(context);
// Instruct how the content should scaleprintHelper.setScaleMode(PrintHelper.SCALE_MODE_FIT);
// Get the bitmap for the ImageView's drawableBitmap bitmap = ((BitmapDrawable) mImageView.getDrawable()).getBitmap();
// Print the bitmapprintHelper.printBitmap("Print Bitmap", bitmap);
PrintHelper
Happy printing!