2017-03-15 65 views
0

PrintManagerを使用して作成したPDFファイルを印刷しようとしています。私はすでに自分の活動にITextSharpを使ってPDFファイルを生成するコードを書いています。以下は私のPDF方式生成である:要するにXamarin AndroidプリントPDFファイル

private byte[] generatePdf() 
    { 
     using (var baos = new MemoryStream()) 
     { 
      using (var ps = new StreamWriter(baos)) 
      { 
       Document doc = new Document(PageSize.A4, 72, 72, 72, 72); 
       PdfWriter writer = PdfWriter.GetInstance(doc, ps.BaseStream); 
       if (!doc.IsOpen()) 
        doc.Open(); 

       doc.AddTitle("Sales Order " + GlobalVars.selectedSales.DocumentNo); 
       var TitleFont = new Font(Font.FontFamily.TIMES_ROMAN, 24, Font.BOLD); 
       var SubTitleFont = new Font(Font.FontFamily.TIMES_ROMAN, 20); 
       var HeadingFont = new Font(Font.FontFamily.TIMES_ROMAN, 18, Font.BOLD); 
       var BoldNormalFont = new Font(Font.FontFamily.TIMES_ROMAN, 14, Font.BOLD); 
       var NormalFont = new Font(Font.FontFamily.TIMES_ROMAN, 14); 

       doc.Add(new Paragraph("SALES ORDER", TitleFont)); 
       ... //other data 
       doc.Close(); 
       writer.Close(); 
      } 
      var bytes = baos.ToArray(); 
      return bytes; 
     } 
    } 

を私はどこでもAndroidデバイスでPDFを保存したくないので、上記のコードが生成されたPDFファイルを含むバイト配列を返します。

このPDFを生成した後は、PrintManagerを使用することになりません。このファイルを生成するには、PrintDocumentAdapter引数のみを使用し、生成したPDFは使用しません。私はPrintDocumentAdapterから継承CustomPrintAdapterを生成しようとしているが、私はそれがPrintedPdfDocumentデータ型を使用していますので、私は私の活動から上記で作成したPDFを再利用できるか分からないのです。

は、君たちはここに正しい方向に私を指してもらえますか?またはカスタムPDFファイルを印刷するための他の簡単なアプローチがありますか?

UPDATE 1

はXamarin Androidは、この記事をもとにSystem.Drawing.dllをサポートしていませんが判明します。

Exception while loading assemblies: System.IO.FileNotFoundException: Could not load assembly 'System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. 
Perhaps it doesn't exist in the Mono for Android profile? 

そして、私はそれを削除したときに、ビルドが成功であるとは例外は発生しません:私は、私はそれを構築しようとしたとき、それは例外を発生させるためITextSharpライブラリがたSystem.Drawingライブラリを使用していますね。私は解決策を試みることに注意してください。パッケージフォルダからすべての内容を削除し、ソリューションを再度開いてビルドしてください。この場合は動作しませんでした。

したがって、Androidデベロッパーサイトに表示されているAndroid.Graphics.Canvasを使用してPDFを生成してみます。

答えて

0

UPDATE 2

私はAndroid developer siteが行う方法のようなAndroid.Graphics.Canvasとは成功生成するPDFを得ませんでした。理由は、私はどのようにページを計算し、内容が動的なのでページを変更するのか分かりません。サイトにgetPrintItemCount()のようなメソッドがありましたが、サイトにはその説明が含まれていないため、何がわかりません。

したがって、私が考えることのできる回避策は、Webサービスエンドポイントによって処理されるWebViewという印刷です。印刷したいページのHTMLレイアウトを作成していますが、WebViewがWebサービスエンドポイントを開きます。幸いなことに、このアプローチでの印刷はうまく行えます。もちろん、このアプローチにはWebサービスが印刷を行うには到達可能であるという制限があります。

これを行うには、まずOnPageFinishedメソッドを使用してページのロードが完了したときにイベントを取得するために、WebViewClientを拡張するカスタムクラスを作成する必要があります。次に、私のアクティビティのprintメソッドを使用します。コンストラクタを使用して渡します。明確にするために、私は自分のコードを添付します。

public class CustomWebViewClient : WebViewClient 
{ 
    private SalesDetailView myActivity; 
    public bool shouldOverrideUrlLoading(WebView view, string url) 
    { 
     return false; 
    } 
    public override void OnPageFinished(WebView view, string url) 
    { 
     Log.Debug("PRINT", "page finished loading " + url); 
     myActivity.doWebViewPrint(url); 
     base.OnPageFinished(view, url); 
    } 
    public CustomWebViewClient(SalesDetailView activity) 
    { 
     myActivity = activity; 
    } 
} 

は、ここに私の活動

public async void doWebViewPrint(string URL) 
    { 
     if (await vm.printCheck()) 
     { 
      PrintDocumentAdapter adapter; 
      if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop) 
       adapter = webView.CreatePrintDocumentAdapter("test"); 
      else 
       adapter = webView.CreatePrintDocumentAdapter(); 
      var printMgr = (PrintManager)GetSystemService(PrintService); 
      printMgr.Print("printTest", adapter, null); 
     } 
    } 

私は、その後、WebViewを作成し、ユーザが印刷ボタンをクリックするたびに、ウェブサイトをロードからdoWebPrint方法です。

Button btnPrintSO = FindViewById<Button>(Resource.Id.btnPrintSO); 
btnPrintSO.Click += delegate 
{ 
    string URL = ServerDatabaseApi.printSOEndpoint + GlobalVars.selectedSales.DocumentNo; 
    webView = new WebView(this); 
    CustomWebViewClient client = new CustomWebViewClient(this); 
    webView.SetWebViewClient(client); 
    webView.Settings.JavaScriptEnabled = true; 
    webView.LoadUrl(URL); 
    webView.Settings.UseWideViewPort = true; 
    webView.Settings.LoadWithOverviewMode = true; 
}; 

これらのアップデートが将来誰にでも役立つと願っています。

+0

あなたはhtmlをローカルで構築できますか? – Vassilis

+0

@ VassilisGrあなたはAndroidでどういう意味ですか?うん、確かにできる。私は、Androidが最終的なデータ(html)を受け取るように、サーバー上にhtmlを構築することを好みます。つまり、Androidはすぐにデータを使用できます。 –

関連する問題