Вот мое демо о печати веб-просмотра (загрузите локальный html) в PDF.
Здесь работает GIF ().

Моя раскладка в xamarin создается следующим образом:
<StackLayout>
<Button Text="save" Clicked="Button_Clicked"/>
<Entry x:Name="MyEntry" Text="5"></Entry>
<Label x:Name="MyLabel"></Label>
<!-- Place new controls here -->
<WebView x:Name="MywebView" HeightRequest="1000" Navigated="MywebView_Navigated"
WidthRequest="1000"/>
</StackLayout>
В достижении Android я использовал MessagingCenter и пользовательский рендерер для веб-просмотра, чтобы добиться этого.
[assembly: ExportRenderer(typeof(Xamarin.Forms.WebView), typeof(MyWebviewRender))]
namespace MyWebView.Droid {class MyWebviewRender: WebViewRenderer {Контекстный контекст; publi c MyWebviewRender (Контекст контекста): база (контекст) {this.context = context; }
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
MessagingCenter.Subscribe<string>(this, "pdf", (key) => {
var printManager = (PrintManager)context.GetSystemService(Context.PrintService);
var printAdapter = new MyPrintDocumentAdapter(context, Control);
var printJob = printManager.Print("MyPrintJob", printAdapter, null);
});
}
}
MyPrintDocumentAdapter.cs
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(10)
.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 i=destination.FileDescriptor;
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://github.com/851265601/PrintLocalWebview2PDF