[英]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");
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);
安裝 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.