gpt4 book ai didi

c# - 初始转换后挂起 TuesPechkin

转载 作者:太空狗 更新时间:2023-10-29 22:36:58 27 4
gpt4 key购买 nike

我正在尝试创建一个可以将样式化的 HTML 文件转换为 PDF 的 Web API。

我正在使用 TuesPechkin 并将我的应用程序安装到 IIS 中(作为 32 位应用程序:我已修改应用程序池以在 32 位模式下运行)。

IIS 8.5 在 Windows Server 2012 R2 上运行。

C# 中的 PDFConversion 类:

using System.Drawing.Printing;
using System.IO;
using TuesPechkin;

namespace PDFApi
{
public class PDFcreator
{
public void convert(string path, string uri)
{
IConverter converter = new StandardConverter(
new RemotingToolset<PdfToolset>(
new Win64EmbeddedDeployment(
new TempFolderDelpoyment())));

var document = new HtmlToPdfDocument
{
GlobalSettings =
{
ProduceOutline = true,
DocumentTitle = "Converted Form",
PaperSize = PaperKind.A4,
Margins =
{
All = 1.375,
Unit = Unit.Centimeters
}
},
Objects =
{
new ObjectSettings { RawData = File.ReadAllBytes(uri) }
}
};

byte[] pdfBuf = converter.Convert(document);

FileStream fs = new FileStream(path, FileMode.Create);
fs.Write(pdfBuf, 0, pdfBuf.Length);
fs.Close();
}
}
}

Controller 如下:

    [Route("converthtml")]
[HttpPost]
[MIMEContentFilter]
public async Task<HttpResponseMessage> ConvertHtml()
{
string temppath = System.IO.Path.GetTempPath();

var streamProvider = new MultipartFormDataStreamProvider(temppath);
await Request.Content.ReadAsMultipartAsync(streamProvider);


string filepath = streamProvider.FileData.Select(entry => entry.LocalFileName.Replace(temppath + "\\", "")).First<string>();
string pdfpath = System.IO.Path.GetTempFileName();
pdfpath = pdfpath.Substring(0, pdfpath.LastIndexOf('.')) + ".pdf";

new PDFcreator().convert(pdfpath, filepath);

var stream = new FileStream(pdfpath, FileMode.Open);
var result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
return result;
}

这里有点奇怪:在 Fiddler 中进行试验,发送一次文件将立即返回 PDF。但是,所有后续 POST 都会让 Fiddler 挂起。检查任务管理器显示此任务的 CPU 和内存分别跳升至 13.5% 和 ~96MB。

Temp 文件夹(存储文件的地方)在成功运行时将包含三个文件:原始上传文件(以类似 GUID 的名称存储)、通过 wkHtmlToPdf 生成的文件(格式为“wktemp-"),以及生成的 pdf(作为 tempXXXX.pdf)。在它挂起的情况下,只能找到第一个文件,说明问题出在wkHtmlToPdf本身的某个地方。

然而,真正的问题是当进程在任务管理器中被手动终止时,API 成功完成,返回完全创建的 pdf!

如果IIS被重置,进程回到原来的状态;新的尝试将毫无问题。

显然,在每次调用后重置 IIS 几乎是不可行的,每次手动终止进程也是不可行的...

这是一个错误/这个问题有什么解决方案吗?

最佳答案

编辑:非常重要 - 这个答案有很多选票,但并不完整。检查the marked solution

            var tempFolderDeployment = new TempFolderDeployment();
var win32EmbeddedDeployment = new Win32EmbeddedDeployment(tempFolderDeployment);
var remotingToolset = new RemotingToolset<PdfToolset>(win32EmbeddedDeployment);

var converter =
new ThreadSafeConverter(remotingToolset);


byte[] pdfBuf = converter.Convert(document);
remotingToolset.Unload();

卸载 remotingToolset 将防止挂起RemotingToolset.Unload();

关于c# - 初始转换后挂起 TuesPechkin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28037517/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com