我所写的网站需要将网页转换成PDF功能。在查看了选项之后,HiQPdf看起来是最好的选择,并且做了所有需要的事情,目前我正在使用免费版本,直到测试结束。
因此,按照说明,我创建网页,并将其传递给PDF创建者和一个位置,以查找所有链接项(主要是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运行它时,它就像我所期望的那样工作,得到的pdf看起来是正确的,一切都在正确的位置。当我在我的计算机上发布到文件系统时,它可以正常工作。当我将上面的文件复制到另一台笔记本电脑并通过它的ipAddress访问它时,它可以正常工作。
当我使用将其放到主测试服务器上时,就会出现这个问题。在这一点上,pdf被创建,文本在那里,但没有样式,一切都是黑色的白色文本。如果我在cshtml文件中包含了一些样式,那么就会得到它。网站上的其他所有内容都正常工作。我已经将本地site.css添加到引导包中,并且它们都没有被捕获。
我认为string baseUri行没有将pdf创建者指向正确的位置,但我已经看过变量中的内容,尝试了许多不同的变体,但没有任何效果。
我看过htmlToConvert中的文本,它看起来是对的,链接似乎指向了正确的方向。
即使将css硬编码到页面中的位置添加链接标记,也不会获得css。
有没有一些微妙的关于发布一个网站,我是在这里错过?尽管开发了多年的ASP.NET MVC应用程序,但这是我第一次不得不发布网站,在我以前的公司,这总是别人的问题。这里,是我的。
发布于 2017-11-07 09:56:09
好的,经过大量测试后,我尝试的每个PDF生成器都会出现问题。除了查看服务器上的css文件之外,在其他任何地方进行测试都是可行的,但是在服务器上进行测试会导致问题。
我通过在cshtml文件中包含样式并对其进行足够的更改,从而使其看起来正确,从而解决了这个问题。这是我讨厌的解决办法,但有效。
发布于 2018-01-30 15:32:35
您是否设置了类似于var pdf = htmlToPdfConverter.ConvertHtmlToPdfDocument(html, "http://www.example.com/css/");的基本Url
发布于 2022-05-03 12:05:16
@安德鲁,我也有同样的问题!
我使用免费版本的HiQPdf的代码在我的本地机器上工作得很好,可以将视图转换成PDF格式,但是在发布到服务器环境(在我的例子中是Azure托管的)时,CSS文件和图像根本没有被拾取。
和您一样,我尝试过各种方法,比如硬编码的绝对URL而不是相对的(不起作用),并将样式包括在.cshtml文件头中(当然,这是一个非常不受欢迎的解决方案)。
解决方案对您来说可能太晚了,但是事实证明,您可以在您的@Server.MapPath()文件中包含.cshtml来解析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文件也是这样,尽管我的解决方案不需要)。
<body>
<div id="ProjectSummary">
<div id="Header">
<img id="Logo" src=@Server.MapPath("~/Content/images/LogoTransparent.png") alt="Logo">
</div>您的本地实例仍将按预期显示样式/图像,但是包含@Server.MapPath()将使其能够在后续环境中工作。
希望这能有所帮助
https://stackoverflow.com/questions/47033423
复制相似问题