14

我已经使用 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

4

9 回答 9

9

Tuesspechkin 在“wkhtmltox.dll”文件的 Win32 和 Win64 嵌入式软件包中有一个 zip 文件作为资源。

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

我一直将 wkhtmltox dll 的副本放在我的 Web 应用程序目录的根部分,并使用我的 Web 应用程序的服务器物理路径将 DLL_FOLDER_PATH 指向它以访问它。

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

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

Tuesspechkin 是 wmkhtmlox dll 文件的包装器。

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

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

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

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

只要您为输入指定 url 而不是原始 html,它就可以很好地工作。

较旧的包没有很好地渲染 css。

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

我现在没有与我一起使用的源代码来抵消您的 Web 应用程序的基本 url,但它只是 HttpRequest 的一个分支。

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

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

于 2015-01-11T19:53:03.040 回答
7

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

在 Visual Studio 中转到 -

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

于 2015-07-07T07:19:28.797 回答
5

我安装了 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;
}
于 2015-02-19T09:11:44.263 回答
1

就我而言,我在 64 位 VPS 上进行部署,然后出现此错误。我通过安装从http://wkhtmltopdf.org/downloads.html下载的 wkhtmltopdf 解决了这个问题。我选择了 32 位安装程序。

于 2015-02-03T06:03:22.613 回答
1

就我而言,我通过在https://www.nuget.org/packages/TuesPechkin.Wkhtmltox.Win32/安装 Wkhtmltox for win32 解决了这个问题

于 2015-06-26T04:22:41.727 回答
1

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

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

为了找到确切的位置,我只使用了 Process Monitor (procmon.exe)。对我来说是C:\Windows\Temp\-169958574\8\0.12.2.1\wkhtmltox.dll

于 2015-09-09T15:28:54.573 回答
1

此错误:无法加载 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
于 2020-05-19T18:38:02.703 回答
0

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

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

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

于 2019-11-11T03:14:57.177 回答
0

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

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

于 2020-12-20T09:02:59.033 回答