2017-08-03 19 views
0

私はただ1つのステップで印刷する必要があるプロジェクトをやっています。印刷ボタンをクリックするだけでドキュメントが直接印刷されます。私はテストプロジェクトを見つけました。印刷ボタンをクリックするとすぐに、2番目のイメージに表示されているページが開きます(これは表示したくありません)。テストプリントを作成して後でそれらの設定を使用するとファイルに設定を保存することができたと思っていました(画像には、プリンタを接続していないということを無視してpdfなどと書かれています)アンドロイドで直接印刷するには?

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); 
      } 
     } 
    } 
} 
+0

https://stackoverflow.com/q/39550539/4606266 – ziLk

答えて

0

私はテストプロジェクトを発見し、できるだけ早く私は、印刷ボタンをクリックすると、それは第二の画像に示されているページを開きます(私はこれが表示されたくありません) 。

アンドロイドフレームワークの一部であるため、印刷ダイアログを非表示にすることはできません。 PrintManager.print methodのドキュメントを参照し

... 注:このメソッドを呼び出すと、印刷ダイアログをもたらすとシステムが提供さPrintDocumentAdapter ....

に接続します

また、ソースコード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; 
      } 
      ... 
     } 
    ... 
} 

ご覧のとおり、PrintManager.printはインテントEXTRA_PRINT_DIALOG_INTENTを送信して、ダイアログを表示します。

関連する問題