私は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");
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パスを使用できます。
これがあなたの質問に少し答えることを願っています。
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;
}
このエラーが発生した場合->ファイルまたはアセンブリ 'TuesPechkin.Wkhtmltox.Win64'またはその依存関係の1つを読み込めませんでした。不正な形式のプログラムを読み込もうとしました。
VisualStudioで-に移動します
[ツール]-> [オプション]-> [プロジェクトとソリューション]-> [Webプロジェクト]-> 64ビットバージョンのIIS Express forWebサイトとプロジェクトを使用します。
私の場合、64ビットVPSにデプロイしていると、このエラーが発生します。 http://wkhtmltopdf.org/downloads.html からダウンロードしたwkhtmltopdfをインストールすることで問題を解決しました。 32ビットインストーラーを選択しました。
私の場合、win32用のWkhtmltoxを https://www.nuget.org/packages/TuesPechkin.Wkhtmltox.Win32/ にインストールすることで問題を解決しました。
Dllを取得するためだけにwkhtmltoxのインストーラーを実行したくない場合は、次のようにすることができます。
@Timothyが示唆しているように、TuesPechkinのwkhtmltox.dllの埋め込みバージョンを使用すると、解凍されて一時ディレクトリに配置されます。このdllをコピーし、StaticDeployment
オプションを使用して問題なく参照しました。
正確な場所を見つけるために、Process Monitor(procmon.exe)を使用しました。私にとってはC:\Windows\Temp\-169958574\8\0.12.2.1\wkhtmltox.dll
これがAnyCpuバージョンで、iis-baseまたはwinformアプリケーションもサポートしています
using TuesPechkin.Wkhtmltox.AnyCPU;
...
var converter = PDFHelper.Factory.GetConverter();
var result = converter.Convert(This.Document);