2017-08-03 77 views
0

我正在做一个项目,我只需要一步打印,只需点击打印按钮即可直接打印文档。我找到了一个测试项目,当我点击打印按钮时,它会打开第二张图片中显示的页面(我不希望显示这个页面)。我想如果可以将设置保存到一个文件,当我做一个测试打印,并在以后使用这些设置(在图像说打印pdf等忽略,目前我没有连接打印机)如何在android上直接打印?

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

我发现了一个试验项目,我只要一点击打印按钮,它会打开第二图像中显示的页面(我不希望这是所示) 。

无法隐藏打印对话框,因为它是android框架的一部分。

参考的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,这将带来对话。

相关问题