• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

PrintManager help

ibwev

Lurker
I have been trying to learn how to print a ListView from my app to a bluetooth printer. This article https://developer.android.com/training/printing/custom-docs has been very enlightening. I have slightly modified it in the attached code. I am having a hard time understanding this line
Code:
writtenPagesArray.append(writtenPagesArray.size(), i);
I assume this means that I need to write a class that has a List array as a class variable. An append method would need to be defined to add an element at the end of the List class variable. If this is correct, why go through this trouble? Wouldn't it be easier to implement writtenPagesArray as an ArrayList to use the add method of ArrayList? Any help or suggested tutorials would be greatly appreciated.


Code:
   private class MyPrintDocumentAdapter extends PrintDocumentAdapter{

        PrintedPdfDocument mPdfDocument;
        int pages;

        public MyPrintDocumentAdapter() {
            super();
        }

        @Override
        public void onStart() {
            super.onStart();
        }

        @Override
        public void onLayout(PrintAttributes oldAttributes,
                             PrintAttributes newAttributes,
                             CancellationSignal cancellationSignal,
                             LayoutResultCallback callback,
                             Bundle metadata) {
            // Create a new PdfDocument with the requested page attributes
            mPdfDocument = new PrintedPdfDocument(HistoryActivity.this, newAttributes);

            // Respond to cancellation request
            if (cancellationSignal.isCanceled() ) {
                callback.onLayoutCancelled();
                return;
            }

            // Compute the expected number of printed pages
            pages = computePageCount(newAttributes);

            if (pages > 0) {
                // Return print information to print framework
                PrintDocumentInfo info = new PrintDocumentInfo
                        .Builder("print_output.pdf")
                        .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
                        .setPageCount(pages)
                        .build();
                // Content layout reflow is complete
                callback.onLayoutFinished(info, true);
            } else {
                // Otherwise report an error to the print framework
                callback.onLayoutFailed("Page count calculation failed.");
            }
        }

        @Override
        public void onWrite(final PageRange[] pageRanges,
                            final ParcelFileDescriptor destination,
                            final CancellationSignal cancellationSignal,
                            final WriteResultCallback callback) {
            // Iterate over each page of the document,
            // check if it's in the output range.
            for (int i = 0; i < pages; i++) {
                // Check to see if this page is in the output range.
                if (containsPage(pageRanges, i)) {
                    // If so, add it to writtenPagesArray. writtenPagesArray.size()
                    // is used to compute the next output page index.
                  //  writtenPagesArray.append(writtenPagesArray.size(), i);   //writtenPagesArray is not referenced anywhere else ma
                                                                                //maybe no need to implement it
                    PdfDocument.Page page = mPdfDocument.startPage(i);

                    // check for cancellation
                    if (cancellationSignal.isCanceled()) {
                        callback.onWriteCancelled();
                        mPdfDocument.close();
                        mPdfDocument = null;
                        return;
                    }

                    // Draw page content for printing
                    drawPage(page);

                    // Rendering is complete, so page can be finalized.
                    mPdfDocument.finishPage(page);
                }
            }

            // Write PDF document to file
            try {
                mPdfDocument.writeTo(new FileOutputStream(
                        destination.getFileDescriptor()));
            } catch (IOException e) {
                callback.onWriteFailed(e.toString());
                return;
            } finally {
                mPdfDocument.close();
                mPdfDocument = null;
            }
            PageRange[] writtenPages = computeWrittenPages();
            // Signal the print framework the document is complete
            callback.onWriteFinished(writtenPages);

        }

        @Override
        public void onFinish() {
            super.onFinish();
        }

        // Check to see if this page is in the output range.
        private boolean containsPage(PageRange[] p,int i){
            try{
                PageRange pr = p[i];
            }catch (IllegalArgumentException e){
                return false;
            }
            return true;
        }


        private int computePageCount(PrintAttributes printAttributes) {
            int itemsPerPage = 4; // default item count for portrait mode

            PrintAttributes.MediaSize pageSize = printAttributes.getMediaSize();
            if (!pageSize.isPortrait()) {
                // Six items per page in landscape orientation
                itemsPerPage = 6;
            }

            // Determine number of print items
            int printItemCount = getPrintItemCount();

            return (int) Math.ceil(printItemCount / itemsPerPage);
        }

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

            // units are in points (1/72 of an inch)
            int titleBaseLine = 72;
            int leftMargin = 54;

            Paint paint = new Paint();
            paint.setColor(Color.BLACK);
            paint.setTextSize(36);
            canvas.drawText("Test Title", leftMargin, titleBaseLine, paint);

            paint.setTextSize(11);
            canvas.drawText("Test paragraph", leftMargin, titleBaseLine + 25, paint);

            paint.setColor(Color.BLUE);
            canvas.drawRect(100, 100, 172, 172, paint);
        }

    }
 
Hello there!
I moved your thread into the Android Development forum for better help with your issue. ;)

I wish I knew even a sliver of what that means :o Kudos to you and other folks who know this kind of stuff!

Hope you get the help you need!
 
That's very puzzling. I've often found that the Google Android developer site is more useful as a reference, rather than a step by step guide.
But this is a poor guide, because as you found, the variable writtenPagesArray isn't declared or referenced anywhere else in the code, nor is it explained. I think it's supposed to keep track of which pages are supposed to be printed. I'd comment these lines out for now, or try and find a better tutorial.
 
Back
Top Bottom