Qt:无法在C#上初始化OLE(错误80010106)-(libwkhtmltox.dll)

Vic*_*idt 7 c# wkhtmltopdf asp.net-core-mvc

即时通讯使用此libwkhtmltox.dll将我的html转换为pdf。我正在使用c#.netCore。

用法:

    private static string CreatePdf(string content, string fileName)
    {
        var fullPath = $"{_projectSettingsOptions.Pdf}/{fileName}";

        using (var sw = new StreamWriter(new FileStream(fullPath, FileMode.Create), Encoding.UTF8))
        {
            sw.Write(content);
            sw.Flush();
        }

        new Pdf(_projectSettingsOptions).Convert(fullPath, content);

        return fullPath;
    }
Run Code Online (Sandbox Code Playgroud)

关于上面的代码:

  • content =我要转换为pdf的html内容。
  • fullPath =将在其中存储html内容。
  • _projectSettingsOptions =项目的路径,例如图像路径,pdf路径等...

然后,我调用Pdf类,传递要转换的路径和内容。

new Pdf(_projectSettingsOptions).Convert(fullPath, content);
Run Code Online (Sandbox Code Playgroud)

这是我的Pdf课:

namespace SiteMFPManager.Library.Util
{

using Assembly;
using DinkToPdf;
using Settings;
using System.IO;

public class Pdf
{
    public Pdf(ProjectSettingsOptions projectSettingsOptions) =>
        new CustomAssemblyLoadContext().LoadUnmanagedLibrary(Path.Combine(projectSettingsOptions.References, "libwkhtmltox", "libwkhtmltox.dll"));

    public void Convert(string fullPath, string content) =>
        new SynchronizedConverter(new PdfTools()).Convert(new HtmlToPdfDocument
        {
            GlobalSettings =
            {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4,
                Margins = new MarginSettings { Top = 10 },
                Out = fullPath,
            },
            Objects =
            {
                new ObjectSettings
                {
                    PagesCount = true,
                    HtmlContent = content,
                    WebSettings = { DefaultEncoding = "utf-8" }
                }
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

CreatePdf方法其执行两次。第一次,它执行并在控制台中显示给我:Qt:无法初始化OLE(错误80010106),第二次执行代码时,应用程序停止,没有异常发生,什么都没有...只是那个消息。

如果您需要更多信息来帮助我解决此问题,请告诉我。

抱歉,如果帖子格式错误,我是新来的...

Yus*_*sh0 5

为了让 SynchronizedConverter 在 .Net Core 中正常工作,您需要将其注册为单例(最有可能在 Startup.cs 配置服务中):

services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
Run Code Online (Sandbox Code Playgroud)

(此处也有描述:https ://github.com/rdvojmoc/DinkToPdf#dependancy-injection )

之后,您可以将转换器注入控制器中,而不是创建新实例。这样 DLL 就总是在同一个线程中被调用。