在 Azure 中将 tuespechkin 与 MVC 项目结合使用
Using tuespechkin with MVC project in Azure
我无法让 pechkin 或 tuespechkin 在我的 Azure 网站上工作。
每当我尝试访问该站点时,它都会挂起,没有任何错误消息(即使关闭了 customErrors)。我还缺少任何进一步的设置吗?一切都在本地完美运行。
对于 64 位应用程序,我将完成以下步骤:
- 使用 Azure 创建一个新的空 MVC 应用程序,确保选择云中的主机
将应用程序更改为 64 位
登录到 Azure 门户并将应用程序升级到基本托管并将其更改为 64 位
- 安装 TuesPechkin.Wkhtmltox.Win64 和 TuesPechkin nuget 包
添加单例class到return 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");
恐怕答案是无法在 Azure 上运行 wkhtmltopdf。
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.
- 它支持 .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)
{
}
这里我们将配置两个ObjectSettings
和GlobalSettings
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;
我无法让 pechkin 或 tuespechkin 在我的 Azure 网站上工作。
每当我尝试访问该站点时,它都会挂起,没有任何错误消息(即使关闭了 customErrors)。我还缺少任何进一步的设置吗?一切都在本地完美运行。
对于 64 位应用程序,我将完成以下步骤:
- 使用 Azure 创建一个新的空 MVC 应用程序,确保选择云中的主机
将应用程序更改为 64 位
登录到 Azure 门户并将应用程序升级到基本托管并将其更改为 64 位
- 安装 TuesPechkin.Wkhtmltox.Win64 和 TuesPechkin nuget 包
添加单例class到return 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");
恐怕答案是无法在 Azure 上运行 wkhtmltopdf。
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.
- 它支持 .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)
{
}
这里我们将配置两个ObjectSettings
和GlobalSettings
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;