首页 > 解决方案 > 支持在 Xamarin Forms 中将 HTML 转换为 PDF

问题描述

参考以下StackOverflow建议,

在 .NET 中将 HTML 转换为 PDF

我尝试使用将HTML文件转换为 PDFHtmlRenderer.PdfSharp ,但不幸的是它显示了如下兼容错误,

HtmlRendererCore.PdfSharpCore 1.0.1 与 netstandard2.0 (.NETStandard,Version=v2.0) 不兼容。包 HtmlRendererCore.PdfSharpCore 1.0.1 支持:netcoreapp2.0 (.NETCoreApp,Version=v2.0)

 HtmlRenderer.Core 1.5.0.5 is not compatible with monoandroid90 (MonoAndroid,Version=v9.0). Package HtmlRenderer.Core 1.5.0.5 supports:
  - net20 (.NETFramework,Version=v2.0)
  - net30 (.NETFramework,Version=v3.0)
  - net35-client (.NETFramework,Version=v3.5,Profile=Client)
  - net40-client (.NETFramework,Version=v4.0,Profile=Client)
  - net45 (.NETFramework,Version=v4.5)      

HtmlRendererCore.PdfSharpCore 1.0.1 is not compatible with monoandroid90 (MonoAndroid,Version=v9.0). Package HtmlRendererCore.PdfSharpCore 1.0.1 supports: netcoreapp2.0 (.NETCoreApp,Version=v2.0)     

我也尝试wkhtmltopdf过,但它在 android 和其他平台项目中引发了类似的错误。

我的要求是仅将HTML 文件转换为 PDF 文件(无需查看 PDF 文件,只需将其保存在本地路径中)。

任何人都可以提供建议吗?

注意:需要开源建议:)

期待你的建议!!!

支持在 Xamarin Forms 中将 HTML 转换为 PDF

标签: pdfxamarinxamarin.formspdf-generationwkhtmltopdf

解决方案


您可以将 HTML 作为流读取并将其存储到本地,如下所示,

public static class FileManager
{
    public static async Task<MemoryStream> DownloadFileAsStreamAsync(string url)
    {
        try
        {
            var stream = new MemoryStream();
            using (var httpClient = new HttpClient())
            {
                var downloadStream = await httpClient.GetStreamAsync(new Uri(url));
                if (downloadStream != null)
                {
                    await downloadStream.CopyToAsync(stream);
                }
            }

            return stream;
        }
        catch (Exception exception)
        {
            return null;
        }
    }

    public static async Task<bool> DownloadAndWriteIntoNewFile(string url, string fileName)
    {
        var stream = await DownloadFileAsStreamAsync(url);
        if (stream == null || stream.Length == 0)
            return false;

        var filePath = GetFilePath(fileName);

        if (!File.Exists(filePath))
            return false;

        File.Delete(filePath);

        // Create file.
        using (var createdFile = File.Create(filePath))
        {
        }

        // Open and write into file.
        using (var openFile = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite))
        {
            stream.WriteTo(openFile);
        }

        return true;
    }

    public static string GetFilePath(string fileName)
    {
        var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), fileName);
        return filePath;
    }

    public static void WriteAsText(string filePath, string contents)
    {
        File.WriteAllText(filePath, contents);
    }

    public static string ReadAsText(string filePath)
    {
        return File.ReadAllText(filePath);
    }
}

您可以读取存储的 pdf 文件并使用 webview 显示,如下所示,

private async void HtmlToPDF()
{
    await FileManager.DownloadAndWriteIntoNewFile("https://www.google.co.in/?gws_rd=ssl", "SavePDF.pdf");
    var filePath = FileManager.GetFilePath("SavePDF.pdf");
    var pdfString = FileManager.ReadAsText(filePath);

    var webView = new WebView
    {
        Source = new HtmlWebViewSource
        {
            Html = pdfString
        }
    };

    this.Content = webView;
}

下面的输出,

在此处输入图像描述

同样,您可以将 HTML 保存为 PDF 并做您想做的事情。


推荐阅读