3

我无法让 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");
    
4

2 回答 2

2

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

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

要添加云服务(假设您安装了 Azure SDK),请转到Visual Studio -> 右键单击​​您的解决方案 ->添加新项目-> 选择节点 -> Azure 云服务-> 单击确定后选择工作角色并单击好的

您的云服务和您的工作人员角色已创建。接下来要做的是配置您的Worker Role以便它可以托管ASP.NET Web API 2通过遵循本教程,此配置非常简单。

Worker 角色配置为托管 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 文本(也许您在请求中发送页面的 html)直接通过页面 url 生成 pdf。

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;
于 2015-08-18T13:29:34.097 回答
1

恐怕答案是不可能让 wkhtmltopdf 在 Azure 上工作。

看到这个线程

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

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

Tuesechkin 支持的用法

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

解决方法

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

于 2015-05-19T23:00:37.037 回答