【问题标题】:Using tuespechkin with MVC project in Azure在 Azure 中将 tuespechkin 与 MVC 项目一起使用
【发布时间】:2015-07-25 18:30:31
【问题描述】:

我无法让 pechkin 或 tuespechkin 在我的 azure 网站上工作。

每当我尝试访问该站点时,它都会挂起而没有错误消息(即使关闭了 customErrors)。我还缺少什么进一步的设置吗?一切都在本地完美运行。

对于 64 位应用程序,我将完成以下步骤:

  • 使用 Azure 创建一个新的 Empty MVC 应用程序,确保选中 Host in the cloud
  • 将应用更改为 64 位

  • 登录 azure 门户并将应用升级到基本托管并将其更改为 64 位

  • 安装 TuesPechkin.Wkhtmltox.Win64 和 TuesPechkin nuget 包
  • 添加一个单例类以返回 IConverter

    public class TuesPechkinConverter
    {
    private static IConverter converter;
    
    public static IConverter Converter
    {
        get
        {
            if (converter == null)
            {
                converter =
            new ThreadSafeConverter(
                new PdfToolset(
                    new Win64EmbeddedDeployment(
                        new TempFolderDeployment())));
            }
    
            return converter;
        }
    }
    }
    
  • 在 Index Action 中添加一个 Home 控制器,代码如下:

    var document = new HtmlToPdfDocument
        {
            GlobalSettings =
            {
                ProduceOutline = true,
                DocumentTitle = "Pretty Websites",
                PaperSize = PaperKind.A4, // Implicit conversion to PechkinPaperSize
                Margins =
                {
                    All = 1.375,
                    Unit = Unit.Centimeters
                }
            },
            Objects = 
            {
               new ObjectSettings { HtmlText = "<h1>Pretty Websites</h1><p>This might take a bit to convert!</p>" },
               new ObjectSettings { PageUrl = "www.google.com" }    
        }
        };
    
        byte[] pdfBuf = TuesPechkinConverter.Converter.Convert(document);
        return File(pdfBuf, "application/pdf", "DownloadName.pdf");
    

【问题讨论】:

  • 对不起,如果我误解了,但我不认为 TuesPechkin 实际上适用于 Azure 网站(根据 github 页面)github.com/tuespetre/TuesPechkin。原因是该库使用了 azure 下不可用的 GDI。
  • 啊,我现在发现了——我可能需要使用第 3 方转换服务 :( 开始调查它,正如这里提到的 stackoverflow.com/questions/23059144/pechkin-with-windows-azure
  • 是否有其他快速且易于使用的替代方案可以在 Azure 上转换 HTML > PDF?

标签: c# .net asp.net-mvc azure tuespechkin


【解决方案1】:

据我所知,您无法使其在网络应用中运行。但是,有一种方法可以做到:您必须创建一个 云服务 并为其添加一个工作者角色。 TuesPechkin 将安装为此工作角色。

工作流程如下:从您的云 Web 应用程序中,您将访问辅助角色(这可以通过将辅助角色配置为托管 Asp.NET Web API 2 来实现)。工作者角色将使用 TuesPechkin 配置转换器并生成 PDF。我们会将 pdf 包装在 web api 响应中并将其发送回。现在,让我们开始吧……

要添加云服务(假设您安装了 Azure SDK),请转到 Visual Studio -> 右键单击​​您的解决方案 -> 添加新项目 -> 选择 Cloud 节点 -> Azure 云服务 -> 点击 OK 后选择 Worker Role 并点击 OK。

您的云服务和您的工作人员角色已创建。接下来要做的是配置您的 Worker Role,以便它可以托管 ASP.NET Web API 2。 这个配置非常简单,按照this 教程进行。

在您将 Worker Role 配置为托管 Web api 后,您必须安装 TuesPechkin.Wkhtmltox.Win64 和 TuesPechkin nuget 包。

您的配置现在应该已准备就绪。现在创建一个控制器,我们将在其中生成 PDF:在您的 Worker Role 中添加一个新类,该类将扩展 ApiController

public class PdfController : ApiController
{
}

向我们的控制器添加一个动作,它将返回一个HttpResponseMessage 对象。

[HttpPost]
public HttpResponseMessage GeneratePDF(PdfViewModel viewModel)
{
}

这里我们将配置两个ObjectSettingsGlobalSettings 对象,它们将应用于HtmlToPdfDocument 对象。 您现在有两个选择。

您可以从 html 文本生成 pdf(也许您在请求中发送了页面的 html)直接通过页面 url。

var document = new HtmlToPdfDocument
{
    GlobalSettings =
    {
        ProduceOutline = true,
        DocumentTitle = "Pretty Websites",
        PaperSize = PaperKind.A4, // Implicit conversion to PechkinPaperSize
        Margins =
        {
            All = 1.375,
            Unit = Unit.Centimeters
        }
    },
    Objects = {
        new ObjectSettings { HtmlText = "<h1>Pretty Websites</h1><p>This might take a bit to convert!</p>" },
        new ObjectSettings { PageUrl = "www.google.com" }
    }
};

现在的一个好处是,在使用页面 url 时,您可以使用 ObjectSettings 对象来发布参数:

var obj = new ObjectSettings();
obj.LoadSettings.PostItems.Add
    (
        new PostItem() 
        {
            Name = "paramName",
            Value = paramValue
        }
    );

此外,根据 TuesPechkin 文档,转换器应该是线程安全的,并且应该保存在某个静态的地方,或者作为一个单例实例:

IConverter converter =
    new ThreadSafeConverter(
         new RemotingToolset<PdfToolset>(
              new Win64EmbeddedDeployment(
                   new TempFolderDeployment())));

最后将 pdf 包装在响应内容中,将响应内容类型设置为 application/pdf 并添加 content-disposition 标头,就是这样:

byte[] result = converter.Convert(document);
MemoryStream ms = new MemoryStream(result);

response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(ms);
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");
response.Content.Headers.Add("content-disposition", "attachment;filename=myFile.pdf");
return response;

【讨论】:

    【解决方案2】:

    恐怕答案是无法让 wkhtmltopdf 在 Azure 上运行。

    See this thread.

    我假设您的意思是在 Windows Azure 网站上运行 wkhtmltopdf。

    wkhtmltopdf 使用 Window 的 GDI API,目前在 Azure 上无法使用 网站。

    Tuespechkin supported usage

    • 它支持 .NET 2.0+、32 位和 64 位进程以及 IIS 托管的应用程序。
    • Azure 网站目前不支持使用 wkhtmltopdf。

    解决方法

    我最终创建了一个运行 wkhtmltopdf.exe 的 Azure 云服务。我将 html 发送到服务,并得到一个 byte[] 作为回报。

    【讨论】:

      猜你喜欢
      • 2013-03-17
      • 1970-01-01
      • 2016-11-13
      • 2017-08-16
      • 1970-01-01
      • 2016-05-15
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多