2017-06-12 5 views
0

私は、Xamarin.Droidプロジェクトのアクティビティのレイアウトの内容を印刷したいと考えています(印刷では、画面に表示されているものをプリンタにワイヤレスで送信して印刷します)。Xamarin Androidのアクティビティのコンテンツを表示しますか?

Xamarinブログの投稿(https://blog.xamarin.com/native-printing-with-android/)の手順に従って試してみましたが、コードが不完全または不明瞭です。誰もがこれを達成するための完全なソリューションを持っていますか?

答えて

1

Xamarinブログの投稿(https://blog.xamarin.com/native-printing-with-android/)の手順を試しましたが、コードが不完全または不明瞭に見えます。誰もがこれを達成するための完全なソリューションを持っていますか?

public class MyPrintDocumentAdapter : PrintDocumentAdapter 
{ 

    View view; 
    Context context; 
    PrintedPdfDocument document; 
    float scale; 

    public MyPrintDocumentAdapter(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); 

     //set the printed PDF attributes 
     var printInfo = new PrintDocumentInfo 
      .Builder("MyPrint.pdf") 
      .SetContentType(PrintContentType.Document) 
      .SetPageCount(1) 
      .Build(); 

     callback.OnLayoutFinished(printInfo, true); 
    } 

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

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

} 

をそして、あなたの印刷しようとする活動のどこかにこのMyPrintDocumentAdapterを使用します:

var printManager = (PrintManager)GetSystemService(Context.PrintService); 
var content = FindViewById<LinearLayout>(Resource.Id.mRoot); 
var printAdapter = new MyPrintDocumentAdapter(this, content); 
var printJob = printManager.Print("MyPrintJob", printAdapter, null); 

は、あなたが投稿ブログによると、あなたは以下のようなPrintDocumentAdapterを実装するために、独自のアダプタを作成する必要があります

チュートリアルの詳細については、Print Custom Documentを参照してください。

ここにはReference of PrintDocumentAdapterがあります。

関連する問題