簡體   English   中英

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,這是我嘗試的第一個路徑,但出現以下錯誤:

附加信息:無法加載 DLL 'wkhtmltox.dll':找不到指定的模塊。 (來自 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 有一個 zip 文件作為“wkhtmltox.dll”文件的 Win32 和 Win64 嵌入包中的資源。

當您使用 Win32 或 Win64 Embedded 程序包時,它會解壓縮文件並將其放置在您指定的目錄中。

我一直將 wkhtmltox dll 的副本放在我的 Web 應用程序目錄的根部分,並使用我的 Web 應用程序的服務器物理路徑將 DLL_FOLDER_PATH 指向它以訪問它。

根據作者的說法,您必須將轉換器設置在靜態字段中才能獲得最佳效果。

我這樣做了,但是在我使用完轉換器后將轉換器設置為 null,這似乎有效。

Tuespehkin 是 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 路徑。

我希望這能稍微回答你的問題。

如果您收到此錯誤 -> 無法加載文件或程序集“TuesPechkin.Wkhtmltox.Win64”或其依賴項之一。 試圖加載格式不正確的程序。

在 Visual Studio 中轉到 -

工具 -> 選項 -> 項目和解決方案 -> Web 項目 -> 將 64 位版本的 IIS Express 用於網站和項目。

我安裝了 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。所以新代碼運行 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;
}

就我而言,我部署在 64 位 VPS 上,然后出現此錯誤。 我通過安裝從http://wkhtmltopdf.org/downloads.html下載的 wkhtmltopdf 解決了這個問題。 我選擇了 32 位安裝程序。

就我而言,我通過在https://www.nuget.org/packages/TuesPechkin.Wkhtmltox.Win32/安裝適用於 win32 的 Wkhtmltox 解決了該問題

如果您不想運行 wkhtmltox 的安裝程序只是為了獲取 dll,您可以執行以下操作:

正如@Timothy 所建議的,如果您使用 TuesPechkin 的 wkhtmltox.dll 的嵌入式版本,它將解壓縮它並將其放在臨時目錄中。 我復制了這個 dll 並使用StaticDeployment選項引用它,沒有任何問題。

為了找到確切位置,我只使用了 Process Monitor (procmon.exe)。 對我來說是C:\\Windows\\Temp\\-169958574\\8\\0.12.2.1\\wkhtmltox.dll

此錯誤:無法加載 DLL 'wkhtmltox.dll':找不到指定的模塊。 (來自 HRESULT 的異常:0x8007007E)在兩種情況下返回:

1- 未安裝部署依賴項:

為了解決這個問題,您可以安裝 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\\Temp\\1402166677\\8\\0.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

這里是 AnyCpu 版本,也支持 iis-base 或 winform 應用程序

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

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

安裝 Visual C++ Redistributable for Visual Studio 2013 解決了我的錯誤。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM