0

I'm doing a project where I need to print in just one step, just click the print button and it prints the document directly. I found a test project and as soon as I click on the print button it opens the page shown in the second image(I don't want this to be shown). I thought if it was possible to save the settings to a file when I make a test print and later use those settings.(In the image says to print pdf etc ignore that, at the moment I have no printer connected)

https://i.stack.imgur.com/hcZDW.png

https://i.stack.imgur.com/yNTSA.png

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Print;
using Android.Graphics;
using Android.Print.Pdf;
using System.IO;

namespace PrintIMPORTteste
{
    [Activity (Label = "KitKatPrintDemo", Theme = "@android:style/Theme.Holo.Light")]
    public class PrintActivity : Activity
    {
        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);
            SetContentView (Resource.Layout.Print);
            var txtview = FindViewById<TextView>(Resource.Id.textview1);
            txtview.Text = "Hello";
            var button = FindViewById<Button> (Resource.Id.button1);
            button.Click += (object sender, EventArgs e) => {
                var printManager = (PrintManager)GetSystemService (Context.PrintService);
                var content = FindViewById<LinearLayout> (Resource.Id.linearLayout1);
                var printAdapter = new GenericPrintAdapter (this, content);
                printManager.Print ("MyPrintJob", printAdapter, null);
            };
        }
    }

    public class GenericPrintAdapter : PrintDocumentAdapter
    {
        View view;
        Context context;
        PrintedPdfDocument document;
        float scale;

        public GenericPrintAdapter (Context context, View view)
        {
            this.view = view;
            this.context = context;
        }

        public override void OnLayout (PrintAttributes oldAttributes, PrintAttributes newAttributes, 
                                       CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras)
        {
            document = new PrintedPdfDocument (context, newAttributes);

            CalculateScale (newAttributes);

            var printInfo = new PrintDocumentInfo
                .Builder ("MyPrint.pdf")
                .SetContentType (PrintContentType.Document)
                .SetPageCount (1)
                .Build ();

            callback.OnLayoutFinished (printInfo, true);
        }

        void CalculateScale (PrintAttributes newAttributes)
        {
            int dpi = Math.Max (newAttributes.GetResolution ().HorizontalDpi, newAttributes.GetResolution ().VerticalDpi);

            int leftMargin = (int)(dpi * (float)newAttributes.MinMargins.LeftMils / 1000);
            int rightMargin = (int)(dpi * (float)newAttributes.MinMargins.RightMils / 1000);
            int topMargin = (int)(dpi * (float)newAttributes.MinMargins.TopMils / 1000);
            int bottomMargin = (int)(dpi * (float)newAttributes.MinMargins.BottomMils / 1000);

            int w = (int)(dpi * (float)newAttributes.GetMediaSize ().WidthMils / 1000) - leftMargin - rightMargin;
            int h = (int)(dpi * (float)newAttributes.GetMediaSize ().HeightMils / 1000) - topMargin - bottomMargin;

            scale = Math.Min ((float)document.PageContentRect.Width () / w, (float)document.PageContentRect.Height () / h);
        }

        public override void OnWrite (PageRange[] pages, ParcelFileDescriptor destination, 
                                      CancellationSignal cancellationSignal, WriteResultCallback callback)
        {
            PrintedPdfDocument.Page page = document.StartPage (0);

            page.Canvas.Scale (scale, scale);

            view.Draw (page.Canvas);

            document.FinishPage (page);

            WritePrintedPdfDoc (destination);

            document.Close ();

            document.Dispose ();

            callback.OnWriteFinished (pages);
        }

        void WritePrintedPdfDoc (ParcelFileDescriptor destination)
        {
            var javaStream = new Java.IO.FileOutputStream (destination.FileDescriptor);
            var osi = new OutputStreamInvoker (javaStream);
            using (var mem = new MemoryStream ()) {
                document.WriteTo (mem);
                var bytes = mem.ToArray ();
                osi.Write (bytes, 0, bytes.Length);
            }
        }
    }
}
Vishal Vaishnav
  • 3,346
  • 3
  • 26
  • 57
SolarExp
  • 5
  • 4

1 Answers1

0

I found a test project and as soon as I click on the print button it opens the page shown in the second image(I don't want this to be shown).

It is not possible to hide the print dialog, as it is part of the android framework.

Referring to the documentation of PrintManager.print method:

... Note: Calling this method will bring the print dialog and the system will connect to the provided PrintDocumentAdapter....

And also referring to the source codes of PrintManager.java:

public PrintJob print(String printJobName, PrintDocumentAdapter documentAdapter,
        PrintAttributes attributes) {
    ...
    PrintDocumentAdapterDelegate delegate = new PrintDocumentAdapterDelegate(
            (Activity) mContext, documentAdapter);
    try {
        Bundle result = mService.print(printJobName, delegate,
                attributes, mContext.getPackageName(), mAppId, mUserId);
        if (result != null) {
            PrintJobInfo printJob = result.getParcelable(EXTRA_PRINT_JOB);
            //call the dialog
            IntentSender intent = result.getParcelable(EXTRA_PRINT_DIALOG_INTENT);
            if (printJob == null || intent == null) {
                return null;
            }
            ...
        }
    ...
}

As you can see, PrintManager.print will send an intent EXTRA_PRINT_DIALOG_INTENT which will bring the dialog anyway.

Elvis Xia - MSFT
  • 10,801
  • 1
  • 13
  • 24