在 Azure 中将 tuespechkin 与 MVC 项目结合使用

Using tuespechkin with MVC project in Azure

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

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

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

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

See this thread.

I am assuming you mean running wkhtmltopdf on Windows Azure Websites.

wkhtmltopdf uses Window's GDI APIs which currently don't work on Azure Websites.

Tuespechkin supported usage

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

解决方法

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

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

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

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

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

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

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

public class PdfController : ApiController
{
}

向我们的控制器添加一个动作,这将 return 一个 HttpResponseMessage object。

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

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

您可以从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 object 到 post 参数:

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 header 就是这样:

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;