TuesPechkin 无法加载 DLL 'wkhtmltox.dll'

TuesPechkin unable to load DLL 'wkhtmltox.dll'

我已经使用 TuesPechkin 有一段时间了,今天我去更新 nuget 包到新版本 2.0.0+ 并注意到 Factory.Create() 不再解决,所以我去了阅读 GitHub 所做的更改并注意到它现在需要 dll 的路径?

IConverter converter =
    new ThreadSafeConverter(
        new PdfToolset(
            new StaticDeployment(DLL_FOLDER_PATH)));

在过去的几个小时里,我尝试了几乎所有我能想到的路径,“\bin”、“\app_data”、“\app_start”等,我可以'似乎找到或弄清楚它想要什么路径和什么dll?

我可以在我的 bin 文件夹中看到 TuesPechkin dll,这是我尝试的第一个路径,但出现以下错误:

Additional information: Unable to load DLL 'wkhtmltox.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

那个 dll 在哪里,现在我可以得到它,因为库似乎不包含它,我尝试安装 TuesPechkin.Wkhtmltox.Win32 包,但仍然找不到 dll。我也在 asp.net 网站项目中使用它,所以我假设使用以下内容应该可以获取路径,对吗?

var path = HttpContext.Current.Server.MapPath(@"~\bin\TuesPechkin.dll");

更多信息:https://github.com/tuespetre/TuesPechkin/issues/57

Tuespechkin 在 'wkhtmltox.dll' 文件的 Win32 和 Win64 嵌入式程序包中有一个 zip 文件作为资源。

当您使用 Win32 或 Win64 Embedded 程序包时,它会解压缩文件并将其放在您指定的目录中。

我已经将 wkhtmltox dll 的副本放在我的网络应用程序目录的根部分,并使用我的网络应用程序的服务器物理路径将 DLL_FOLDER_PATH 指向它开始吧。

根据作者的说法,您必须在静态字段中设置转换器以获得最佳效果。

我这样做了,但是当我用完它时将转换器设置为 null,这似乎有效。

Tuespechkin 是 wmkhtmlox dll 文件的包装器。

原始文件是用 C++ 编写的,因此不会自动在 C# 或 VB.NET 或任何其他托管代码域中使用。

Tuespechkin.dll 文件不包含 'wkhtmltox.dll' 的副本。您要么必须使用其他嵌入式部署模块之一,要么在从 Internet 下载后在您的 Web 应用程序中安装 'wkhtmltox.dll' 的副本。这就是我所做的,它似乎工作得很好。

我正在使用 Team Foundation Server,尝试在使用 Tuespechkin 例程后编译代码将第一次失败,因为 'wkhtmltox.dll' 文件被锁定,但您所要做的只是重试您的构建并它会通过的。

我遇到了 32 位例程无法在 64 位环境中工作以及 64 位环境无法在本地主机上测试的问题。在检查了 Tuespechkin 以及 Win32 和 Win64 嵌入式部署包的源代码后,我采用了我想出的解决方法。

只要您为输入指定 url 而不是原始 html.

,它就可以很好地工作

旧包没有很好地呈现 css。

如果您使用的是 print.aspx 例程,则可以为其创建 url 作为与主 url.

的偏移量

我现在没有我正在使用的源代码来偏移您的 Web 应用程序的基础 url,但它只是 HttpRequest 的一个分支。

您必须使用物理路径来查找 .dll,但您可以为打印例程使用 Web 路径。

我希望这能稍微回答你的问题。

在我的例子中,我在 64 位 VPS 上部署然后我得到了这个错误。我通过安装从 http://wkhtmltopdf.org/downloads.html 下载的 wkhtmltopdf 解决了这个问题。我选择了 32 位安装程序。

我安装了 TuesPechkin.Wkhtmltox.Win64 Nuget 包并在 单例 中使用了以下代码:

public class PechkinPDFConvertor : IPDFConvertor
{
    IConverter converter =
               new ThreadSafeConverter(
                  new RemotingToolset<PdfToolset>(
                       new Win64EmbeddedDeployment(
                           new TempFolderDeployment())));

    public byte[] Convert(string html)
    {
        //            return PechkinSync.Convert(new GlobalConfig(), html);
        return converter.Convert(new HtmlToPdfDocument(html));
    }
}

Web 应用程序必须 运行 在 x64 中,否则您将收到有关尝试在 x86 环境中加载 x64 程序集的错误。想必你在设计时要选择x64或x86,并使用相应的nuget包,在web.config.

中选择这个比较好

编辑:上面的代码在一台服务器上失败,消息与您的完全相同 - 这是因为没有安装 VC++ 2013。所以新代码是 运行ning x86如下

try
{
    string path = Path.Combine(Path.GetTempPath(), "MyApp_PDF_32");
    Converter = new ThreadSafeConverter(
                  new RemotingToolset<PdfToolset>(
                       new Win32EmbeddedDeployment(
                           new StaticDeployment(path))));
}
catch (Exception e)
{
    if (e.Message.StartsWith("Unable to load DLL 'wkhtmltox.dll'"))
    {
        throw new InvalidOperationException(
        "Ensure the prerequisite C++ 2013 Redistributable is installed", e);
    }
    else
        throw;
}

就我而言,我已通过在 https://www.nuget.org/packages/TuesPechkin.Wkhtmltox.Win32/

安装适用于 win32 的 Wkhtmltox 解决了问题

如果您遇到此错误 -> 无法加载文件或程序集 'TuesPechkin.Wkhtmltox.Win64' 或其依赖项之一。试图加载格式不正确的程序。

在Visual Studio转到-

工具 -> 选项 -> 项目和解决方案 -> Web 项目 -> 为网站和项目使用 64 位版本的 IIS Express。

如果您不想 运行 wkhtmltox 的安装程序只是为了获取 dll,您可以执行以下操作:

正如@Timothy 所建议的,如果您使用来自 TuesPechkin 的 wkhtmltox.dll 的嵌入式版本,它将解压缩并将其放在一个临时目录中。我复制了这个 dll 并使用 StaticDeployment 选项引用它,没有任何问题。

为了找到确切的位置,我刚刚使用了 Process Monitor (procmon.exe)。对我来说是 C:\Windows\Temp\-169958574[=11=].12.2.1\wkhtmltox.dll

这里是AnyCpu版本,也支持iis-base或者winform应用

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

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

此错误:无法加载 DLL 'wkhtmltox.dll':找不到指定的模块。 (Exception from HRESULT: 0x8007007E) 在两种情况下返回:

1- Deploy 依赖未安装:

为了解决这个问题,您可以安装 nuget 包 "TuesPechkin.Wkhtmltox.Win64" 并使用此代码(对于 IIS 中的 WebApplications 运行):

IConverter converter =
    new ThreadSafeConverter(
        new RemotingToolset<PdfToolset>(
            new Win64EmbeddedDeployment(
                new TempFolderDeployment())));

// Keep the converter somewhere static, or as a singleton instance!
// Do NOT run the above code more than once in the application lifecycle!

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

在运行时,此代码会将依赖项 "wkhtmltox.dll" 复制到一个临时目录中,例如:"C:\Windows\Temp02166677[=43=].12.2.1"。可以使用以下方式获取文件的目标:

var deployment = new Win64EmbeddedDeployment(new TempFolderDeployment());
Console.WriteLine(deployment.Path);

2- Microsoft Visual C++ 2013 Redistributable 未安装:

如此处所述: https://github.com/tuespetre/TuesPechkin/issues/65#issuecomment-71266114,需要 Visual C++ 2013 运行时。

README 中的解决方案是:

您必须安装 Visual C++ 2013 运行时才能使用这些包。否则,您将需要从他们的网站下载 wkhtmltopdf 的 MingW 版本及其依赖项,并将其与库一起使用。 https://github.com/tuespetre/TuesPechkin#wkhtmltoxdll

或者,您可以安装 Microsoft Visual C++ 2013 Redistributable:

choco install msvisualcplusplus2013-redist

为 Visual Studio 2013 安装 Visual C++ Redistributable 解决了我的错误。

https://www.microsoft.com/en-us/download/details.aspx?id=40784