【问题标题】:Running a TuesPechkin converter more than once多次运行 TuesPechkin 转换器
【发布时间】:2015-07-07 21:19:46
【问题描述】:

我将 TuesPechkin 用于我的 Web 应用程序,我正在使用 VS2013 在 IIS 上进行本地测试。用户单击一个按钮,页面的当前 HTML 将保存为 PDF 文件,然后通过电子邮件发送出去。随着网站数据的变化,此过程将定期运行。

converter.Convert(document) 第一次运行时,它会毫无问题地转换。然而,随后的每一次尝试都会导致进程挂起,我需要重新启动 VS。

下面是我用来测试的一些默认代码。

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

    IConverter converter =
        new ThreadSafeConverter(
            new PdfToolset(
                new Win32EmbeddedDeployment(
                    new TempFolderDeployment())));

    byte[] result = converter.Convert(document);
}

谁能指出我正确的方向?到目前为止,我的大部分故障排除都导致了一些关于线程和池的讨论,但没有针对多次运行 TuesPechkin 的具体代码解决方案。

【问题讨论】:

    标签: c# .net asp.net-mvc pdf-generation tuespechkin


    【解决方案1】:

    你试过ThreadSafeConverter吗? StandardConverter 仅适用于小型控制台应用程序。

    IConverter converter =
        new ThreadSafeConverter(
            new RemotingToolset<PdfToolset>(
                new Win32EmbeddedDeployment(
                    new TempFolderDeployment())));
    
    byte[] result = converter.Convert(document);
    

    请注意,您应该将转换器保持在静态位置,或者作为单例实例(如 here 所述)。

    【讨论】:

    • 更改该代码块会导致同样的问题。我已修改问题以包含包含方法,该方法目前只是您的普通公共无效。你是说我应该将转换器定义和转换本身移到它自己的方法中,并将document 传递给它吗?
    • 尝试将converter 移动到静态类或单例中。由于对wkhtmltopdf的依赖,它只能创建一个converter,意味着你需要复用它。
    • 请注意,您的代码与我的代码略有不同。在我链接的 Tuesspechkin 常见问题解答中,提到您需要为 IIS 应用程序使用 RemotingToolset。不确定这是否会影响您的问题。
    • 您在此处查看参考代码link,在 IIS 应用程序中,获取转换器时务必使用锁定
    【解决方案2】:

    由于这个应用在 IIS 上,可以得到单例转换器,并使用 RemotingToolset

    var toolSet = new RemotingToolset<PdfToolset>(winAnyCpuEmbeddedDeployment);
    

    // 那么

    using TuesPechkin.Wkhtmltox.AnyCPU;
    ...
    var converter = PDFHelper.Factory.GetConverter();
    var result = converter.Convert(This.Document);
    

    参考:https://github.com/tloy1966/TuesPechkin

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 2017-03-23
      • 1970-01-01
      相关资源
      最近更新 更多