async Task OnPageFinished(Android.Webkit.WebView view, string fileName, TaskCompletionSource <ToFileResult> taskCompletionSource) { var widthString = await view.EvaluateJavaScriptAsync("document.documentElement.offsetWidth"); var width = double.Parse(widthString.ToString()); var heightString = await view.EvaluateJavaScriptAsync("document.documentElement.offsetHeight"); var height = double.Parse(heightString.ToString()); int specWidth = MeasureSpecFactory.MakeMeasureSpec((int)(width * Display.Scale), MeasureSpecMode.Exactly); int specHeight = MeasureSpecFactory.MakeMeasureSpec((int)(height * Display.Scale), MeasureSpecMode.Exactly); view.Measure(specWidth, specHeight); view.Layout(0, 0, view.MeasuredWidth, view.MeasuredHeight); await Task.Delay(50); using (var _dir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDocuments)) { if (!_dir.Exists()) { _dir.Mkdir(); } var path = _dir.Path + "/" + fileName + ".png"; using (var file = new Java.IO.File(path)) { if (!file.Exists()) { file.CreateNewFile(); } using (var stream = new FileStream(file.Path, FileMode.Create, System.IO.FileAccess.Write)) { if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Honeycomb) { await Task.Delay(1000); using (var bitmap = Bitmap.CreateBitmap(System.Math.Max(view.MeasuredWidth, view.ContentWidth()), view.MeasuredHeight, Bitmap.Config.Argb8888)) { using (var canvas = new Canvas(bitmap)) { if (view.Background != null) { view.Background.Draw(canvas); } else { canvas.DrawColor(Android.Graphics.Color.White); } view.SetClipChildren(false); view.SetClipToPadding(false); view.SetClipToOutline(false); await Task.Delay(50); view.Draw(canvas); await Task.Delay(50); bitmap.Compress(Bitmap.CompressFormat.Png, 80, stream); } } } else { await Task.Delay(1000); #pragma warning disable CS0618 // Type or member is obsolete using (var bitmap = Bitmap.CreateBitmap(view.DrawingCache)) #pragma warning restore CS0618 // Type or member is obsolete { bitmap.Compress(Bitmap.CompressFormat.Png, 80, stream); } } stream.Flush(); stream.Close(); taskCompletionSource.SetResult(new ToFileResult(false, path)); view.Dispose(); } } } }