1
URL 내용을 인쇄하는 데 문제가 발생할 수 있습니다. 내 응용 프로그램의 웹보기에서 PDF 파일을 열고 인쇄 할 별도의 단추를 배치하여 문서를 인쇄하려고합니다. 아래 코드를 살펴보십시오. 이전화 기본 프린터 기능을 사용하여 Xamarin 안드로이드의 WebView에서 PDF의 내용을 인쇄하는 방법
[Activity(Label = "PdfView")]
public class PdfView : Activity
{
public static PdfView _context;
Android.Content.Res.Resources res;
private static string ErrorTitle, ErrorMsg;
private static ProgressBar progressBar;
WebView mWebView, Web_Print;
RelativeLayout LL_Print,LL_input;
string MyUrl;
private WebClient _webClient = new WebClient();
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
_context = this;
res = _context.Resources;
SetContentView(Resource.Layout.web_pdf);
ErrorTitle = res.GetString(Resource.String.error_title);
ErrorMsg = res.GetString(Resource.String.Somethingwentwrong);
progressBar = FindViewById<ProgressBar>(Resource.Id.progressBar1);
LL_Print = FindViewById<RelativeLayout>(Resource.Id.LL_Print);
LL_input = FindViewById<RelativeLayout>(Resource.Id.LL_input);
Web_Print = FindViewById<WebView>(Resource.Id.Web_Print);
Web_Print.Visibility = ViewStates.Gone;
LL_Print.Visibility = ViewStates.Gone;
var customWebViewClient = new WebViewLoaderClient();
mWebView = FindViewById<WebView>(Resource.Id.Web);
mWebView.Download += MWebview_Download;
mWebView.Settings.JavaScriptEnabled = true;
mWebView.Settings.BuiltInZoomControls = true;
mWebView.SetWebViewClient(customWebViewClient);
mWebView.SetWebChromeClient(new WebChromeClient());
String myPdfUrl = APIConstants.InvoicePdfUrl;
MyUrl = "http://docs.google.com/gview?embedded=true&url=" + myPdfUrl;
mWebView.LoadUrl(MyUrl);
InitComonents();
}
private void MWebview_Download(object sender, DownloadEventArgs e)
{
mWebView.Visibility = ViewStates.Gone;
LL_input.Visibility = ViewStates.Gone;
LL_Print.Visibility = ViewStates.Visible;
Web_Print.Visibility = ViewStates.Visible;
var Url = e.Url;
CustomWebViewClient client = new CustomWebViewClient(this);
Web_Print.SetWebViewClient(client);
Web_Print.SetWebChromeClient(new WebChromeClient());
Web_Print.Settings.JavaScriptEnabled = true;
Web_Print.LoadUrl(Url);
Web_Print.Settings.UseWideViewPort = true;
Web_Print.Settings.LoadWithOverviewMode = true;
}
#region // Initializing widgets
public void InitComonents()
{
try
{
LinearLayout img_viw = FindViewById<LinearLayout>(Resource.Id.img_WV_back);
LinearLayout img_viw_Home = FindViewById<LinearLayout>(Resource.Id.img_WV_home);
}
catch (Exception ex)
{
ex.Message.ToString();
}
}
#endregion
#region // Webview client
public class WebViewLoaderClient : WebViewClient
{
public event EventHandler<bool> OnPageLoaded;
public override bool ShouldOverrideUrlLoading(WebView view, string url)
{
view.LoadUrl(url);
return true;
}
public override void OnPageStarted(WebView view, string url, Android.Graphics.Bitmap favicon)
{
base.OnPageStarted(view, url, favicon);
progressBar.Visibility = ViewStates.Visible;
}
public override void OnPageFinished(WebView view, string url)
{
base.OnPageFinished(view, url);
progressBar.Visibility = ViewStates.Gone;
}
public override void OnReceivedError(WebView view, ClientError errorCode, string description, string failingUrl)
{
base.OnReceivedError(view, errorCode, description, failingUrl);
view.Visibility = ViewStates.Gone;
Error();
}
}
class MonkeyWebViewClient : WebViewClient
{
public override bool ShouldOverrideUrlLoading(WebView view, string url)
{
view.LoadUrl(url);
return true;
}
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
{
view.LoadUrl("file:///android_asset/myerrorpage.html");
}
}
#endregion
#region Error Message for Web View Error
public static void Error()
{
AlertDialog.Builder alert = new AlertDialog.Builder(_context);
alert.SetTitle(ErrorTitle);
alert.SetMessage(ErrorMsg);
alert.SetPositiveButton(Resource.String.ok, (senderAlert, args) =>
{
_context.Finish();
});
alert.SetCancelable(false);
Dialog dialog = alert.Create();
dialog.Show();
}
public void doWebViewPrint(string url)
{
PrintDocumentAdapter adapter;
if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop)
adapter = mWebView.CreatePrintDocumentAdapter("test");
else
adapter = mWebView.CreatePrintDocumentAdapter();
var printMgr = (PrintManager)GetSystemService(PrintService);
printMgr.Print("printTest", adapter, null);
}
#endregion
}
public class CustomWebViewClient : WebViewClient
{
private PdfView myActivity;
public bool shouldOverrideUrlLoading(WebView view, string url)
{
view.LoadUrl(url);
return false;
}
public override void OnPageFinished(WebView view, string url)
{
Log.Debug("PRINT", "page finished loading " + url);
myActivity.doWebViewPrint(url);
//CreateWebPrintJob(view);
base.OnPageFinished(view, url);
}
private void CreateWebPrintJob(WebView view)
{
throw new NotImplementedException();
}
public CustomWebViewClient(PdfView activity)
{
myActivity = activity;
}
}
}
수 쇼는 PDF의 내용과 프린터 기능을 열고 있지만, PDF의 내용이
그래서이 문제를 해결하고 웹에서 볼 수있는 PDF 콘텐츠를 인쇄하여 인쇄 할 수 있습니까?
이 문제를 재현 할 수있는 기본적인 데모를 공유 시겠어요 여기에 전체 게임 체인저를 만든 다음 코드를 참조하십시오? PDF 링크 가짜 일 수 있습니다. –
PrintManager가 미리보기 및 인쇄용 내용을 찾는 방법을 결정하는 onLayout() 및 onWrite() 구현을 보지 못했습니다 – Nonos
@ROHIT : 문제에 대한 해결책을 찾았습니까? – MilanG