私はただ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);
}
}
}
}
https://stackoverflow.com/q/39550539/4606266 – ziLk