HiQPdf 找不到 css

HiQPdf not finding the css

我写的网站需要将网页转换为PDF的功能。在查看了选项后,HiQPdf 看起来是最好的选择并且做了所有需要的,目前我正在使用免费版本直到测试完成。

因此,按照说明,我创建了网页并将其连同一个位置一起传递给 PDF 创建器,以查找所有 linked 项目(主要是 css)。代码去

var model = new SomeKindOfModel
{
    SetSomeStuff = stuff
};

string htmlToConvert = RenderRazorViews.RenderViewAsString(ControllerContext, "Print", model);
string baseUri = $"{Request.Url.Scheme}://{Request.Url.Authority}";

HtmlToPdf htmlToPdfConverter = new HtmlToPdf();
byte[] pdfBuffer = htmlToPdfConverter.ConvertHtmlToMemory(htmlToConvert, baseUri);

return new FileContentResult(pdfBuffer, "application/pdf");

相当标准的代码。

现在,当我 运行 来自 Visual Studio 时,它按我预期的方式工作,生成的 pdf 看起来正确,一切都在正确的位置。当我发布到计算机上的文件系统时,它工作正常。当我将上述文件复制到另一台笔记本电脑并通过它的 ipAddress 访问它时,它工作正常。

问题出现在我使用web deploy包放到主测试服务器上的时候。此时 pdf 已创建,文本已存在,但没有样式,一切都只是白底黑字。如果我在 cshtml 文件中包含一些样式,那么它就会被拾取。网站上的其他一切都正常工作。我已将本地 site.css 添加到 bootstrap 包中,但它们都没有被提取

我认为 string baseUri 行没有将 pdf 创建者指向正确的位置,但我查看了变量中的内容并尝试了很多不同的变体,但没有任何效果。

我查看了 htmlToConvert 中的文字,看起来不错 link 似乎指向了正确的方向。

即使将 link 标记添加到页面并硬编码 css 的位置也不会提取 css.

关于发布网站,是否有一些我在这里遗漏的微妙之处?尽管开发 ASP.NET MVC 应用程序已有多年,但这是我第一次真正不得不发布网站,在我以前的公司,这总是别人的问题。给,是我的。

好的,经过大量测试后,我尝试的每个 PDF 生成器都会出现问题。在其他任何地方测试,但查看服务器上的 css 文件都可以,但在服务器上测试会导致问题。

我通过在 cshtml 文件中包含样式并进行充分更改以使其看起来正确来解决此问题。这是一个我讨厌的解决方案,但它确实有效。

你有没有设置一个BaseUrl喜欢 var pdf = htmlToPdfConverter.ConvertHtmlToPdfDocument(html, "http://www.example.com/css/");

另请参阅此答案:

@Andrew 我遇到了完全相同的问题!

我使用免费版 HiQPdf 的代码在我的本地机器上完美运行,可以将视图转换为 PDF,但是在发布到服务器环境(Azure-hosted 在我的例子中)时,CSS 文件和图片根本没有被拾取。

像你一样,我尝试过各种方法,比如 hard-coded 绝对 URL 而不是相对(没有用),以及在 .cshtml 文件头中包含样式(这当然是一个非常不受欢迎的解决方案).

解决方案对您来说可能为时已晚, 但事实证明,您可以在 .cshtml 文件中包含 @Server.MapPath() 来解析 PDF 的相对 URL。

所以

href=@Server.MapPath("~/Content/css/site.css")

而不是

href="~/Content/css/site.css" />

下面是一个完整的块:

<head>
    <title>Summary</title>
    
    <link rel="stylesheet" href=@Server.MapPath("~/Content/css/bootstrap_v5.css") />

    <link rel="stylesheet" href=@Server.MapPath("~/Content/css/site.css") />
</head>

还需要 MapPath 来解析图像(我假设 JavaScript 文件也是如此,尽管我的解决方案需要 none)

<body>
    <div id="ProjectSummary">
        <div id="Header">
                <img id="Logo" src=@Server.MapPath("~/Content/images/LogoTransparent.png") alt="Logo">
        </div>

您的本地实例仍将按预期显示 styling/images,但包含 @Server.MapPath() 应该可以使其在后续环境中工作。

希望对您有所帮助