从Xamarin.Forms应用程序打印

时间:2016-03-01 10:46:53

标签: printing xamarin xamarin.forms

我对Xamarin都很陌生,而且我目前正致力于样本或概念验证"应用程序使用Xamarin.Forms。

我应该从这个应用程序执行打印任务,虽然我现在还不确定要打印什么(屏幕,标签内容,文件等)。

无论哪种方式,从Xamarin.Forms应用程序打印最简单的方法是什么? (目前的目标主要是Android 4.4 +)。

我希望这不是太复杂了:)

修改

好的,让我更新这篇文章,因为原始文本可能有点雄心勃勃/含糊不清。

我有一个Xamarin.Forms项目(+一个Android部分),我在项目的XF部分有一些HTML,我需要进入WebView并打印它。 根据我的理解,WebView必须在项目的Android部分完成,因为这是处理打印的地方。 我希望这可以通过代码完成,因为我不需要显示WebView,只需打印它的内容。 项目的Android部分只有MainActivity,没有布局或XAML文件。 我不知道在哪里添加WebView或如何访问它(除了DependecyService似乎是一个热门话题),所以我有点卡在这里。

我认为这项任务对于那些拥有比我更多Xamarin经验的人来说应该是微不足道的。

4 个答案:

答案 0 :(得分:4)

XF支持的每个平台都有自己的打印机制。 XF不以跨平台方式提供任何打印抽象。您需要为每个层编写打印逻辑,并使用DependencyService(或其他一些DI引擎)将其公开给XF。

答案 1 :(得分:3)

这是一个很好的例子,当然,使用依赖服务: https://codemilltech.com/xamarin-forms-e-z-print/

答案 2 :(得分:0)

您可以使用xamarin componentstore中的xfinium pdf组件处理列表/发票的打印。然后你创建你的_pdffile,然后调用以下方法启动adobereader,从那里你可以选择一台打印机(在我的情况下是google cloudprint)

     public void printPdfToCloud(string _pdffile)
        {
            try
            {
                var saveto = System.IO.Path.Combine(Android.OS.Environment.ExternalStorageDirectory.ToString(), "YourApp/"+_pdffile);
                string file_path = saveto;
                if (System.IO.File.Exists(file_path))
                {
                    Android.Net.Uri pdfFile = Android.Net.Uri.FromFile(new Java.IO.File(file_path));
                    Intent pdfIntent = new Intent(Intent.ActionView);
                    pdfIntent.SetPackage("com.adobe.reader");
                    pdfIntent.SetDataAndType(pdfFile, "application/pdf");
                    pdfIntent.SetFlags(ActivityFlags.NoHistory);
                    StartActivity(pdfIntent);


                }else

                { 
                   // give a note that the file does not exist
                }

            }



            catch (Exception E)
            {
                // Do some Error dialog
            }

        }

答案 3 :(得分:0)

我很想这样做,但这太难了。最终将其内置到Forms9Patch-MIT许可的open source project中。

验证是否可以打印

在打印之前,您应该验证设备上是否可以进行打印。为此,请致电:

if (Forms9Patch.PrintService.CanPrint)
{
    // do the printing here
}

打印Xamarin.Forms.WebView的内容

using Forms9Patch;
    ...
    var myWebView = new Xamarin.Forms.WebView
    myWebView.Source = new HtmlWebViewSource 
    { 
        Html = "some HTML text here" 
    };
    ...
    myWebView.Print("my_print_job_name");

请注意,您的WebView不必附加到布局。这样一来,您无需在应用程序的UI中显示WebView即可进行打印。

打印HTML字符串

using Forms9Patch;
    ...
    var myHtmlString =  @"
                            <!DOCTYPE html>
                            <html>
                            <body>
                            <h1>Convert to PNG</h1>
                            <p>This html will be converted to a PNG, PDF, or print.</p>
                            </body>
                            </html>
                            ";
    ...
    myHtmlString.Print("my_print_job_name");

请注意:iOS有时会将分页符放在奇怪的地方。我有一个StackOverflow赏金计划,以了解发生这种情况的原因以及解决方法。

使用EmbeddedResource作为Xamarin.Forms.WebView的源

这是我建立的一种实验性功能,发现它很有用。因此,文档很少。它允许您将HTML内容放入应用程序的EmbeddedResources文件夹中的文件夹中,然后将其用作WebView的源。比使用Xamarin提供的特定于平台的方法更好的解决方案。它还支持将所有HTML内容放入一个zip文件中。请查看source code,了解其工作原理。