web-dev-qa-db-ja.com

TuesPechkinがロードできません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フォルダーにTuesPechkindllが表示され、これが最初に試したパスでしたが、次のエラーが発生しました。

追加情報:ロードできませんDLL 'wkhtmltox.dll':指定されたモジュールが見つかりませんでした。(HRESULTからの例外:0x8007007E)

そのdllはどこにあり、ライブラリに含まれていないように見えるので入手できます。TuesPechkin.Wkhtmltox.Win32パッケージをインストールしようとしましたが、dllがまだ見つかりません。また、これをasp.net Webサイトプロジェクトで使用しているので、次を使用するとパスを取得できると思いますよね?

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

詳細情報: https://github.com/tuespetre/TuesPechkin/issues/57

12
devfunkd

Tuespechkinには、「wkhtmltox.dll」ファイルのWin32およびWin64組み込みパッケージのリソースとしてZipファイルがあります。

Win32またはWin64Embeddedパッケージを使用すると、ファイルが解凍され、指定したディレクトリに配置されます。

私はwkhtmltoxdllのコピーをWebアプリディレクトリのルート部分に置き、Webアプリのサーバー物理パスを使用してDLL_FOLDER_PATHをそのディレクトリにポイントしています。

著者によると、最良の結果を得るには、コンバーターを静的フィールドに設定する必要があります。

私はそれを行いますが、使い終わったらコンバーターをnullに設定すると、うまくいくようです。

Tuespechkinは、wmkhtmloxdllファイルのラッパーです。

元のファイルはC++で記述されているため、C#、VB.NET、またはその他のマネージコードドメインで自動的に使用することはできません。

Tuespechkin.dllファイルに「wkhtmltox.dll」のコピーが含まれていません。他の組み込みデプロイメントモジュールの1つを使用するか、インターネットからダウンロードした後、Webアプリに「wkhtmltox.dll」のコピーをインストールする必要があります。それが私がしていることであり、それはうまく機能しているようです。

Team Foundation Serverを使用していますが、Tuespechkinルーチンを使用した後にコードをコンパイルしようとすると、「wkhtmltox.dll」ファイルがロックされるため、最初は失敗しますが、ビルドを再試行するだけで完了します。

32ビットルーチンが64ビット環境で機能せず、64ビット環境がローカルホストでテストできないという問題がありました。 TuespechkinとWin32およびWin64組み込み展開パッケージのソースコードを調べた後、思いついた回避策を実行しました。

生のhtmlではなく入力のURLを指定する限り、これはうまく機能します。

古いパッケージはcssをうまくレンダリングしませんでした。

Print.aspxルーチンを使用している場合は、メインURLからのオフセットとしてそのURLを作成できます。

この時点で、WebアプリケーションのベースURLにオフセットするために使用しているソースコードはありませんが、これは単にHttpRequestの派生物です。

.dllを見つけるには物理パスを使用する必要がありますが、印刷ルーチンにはWebパスを使用できます。

これがあなたの質問に少し答えることを願っています。

8
Timothy Dooling

TuesPechkin.Wkhtmltox.Win64 Nugetパッケージをインストールし、次のコードをsingletonで使用しました。

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でこれを選択する方がよいでしょう。

編集:上記のコードは、あなたとまったく同じメッセージで1つのサーバーで失敗しました-これは、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;
}
5
Kaido

このエラーが発生した場合->ファイルまたはアセンブリ 'TuesPechkin.Wkhtmltox.Win64'またはその依存関係の1つを読み込めませんでした。不正な形式のプログラムを読み込もうとしました。

VisualStudioで-に移動します

[ツール]-> [オプション]-> [プロジェクトとソリューション]-> [Webプロジェクト]-> 64ビットバージョンのIIS Express forWebサイトとプロジェクトを使用します。

5
Prateek Gupta

私の場合、64ビットVPSにデプロイしていると、このエラーが発生します。 http://wkhtmltopdf.org/downloads.html からダウンロードしたwkhtmltopdfをインストールすることで問題を解決しました。 32ビットインストーラーを選択しました。

1
rajeemcariazo

私の場合、win32用のWkhtmltoxを https://www.nuget.org/packages/TuesPechkin.Wkhtmltox.Win32/ にインストールすることで問題を解決しました。

1
Hoàng Nghĩa

Dllを取得するためだけにwkhtmltoxのインストーラーを実行したくない場合は、次のようにすることができます。

@Timothyが示唆しているように、TuesPechkinのwkhtmltox.dllの埋め込みバージョンを使用すると、解凍されて一時ディレクトリに配置されます。このdllをコピーし、StaticDeploymentオプションを使用して問題なく参照しました。

正確な場所を見つけるために、Process Monitor(procmon.exe)を使用しました。私にとってはC:\Windows\Temp\-169958574\8\0.12.2.1\wkhtmltox.dll

1
emragins

これがAnyCpuバージョンで、iis-baseまたはwinformアプリケーションもサポートしています

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

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

0
Max CHien