Reputation: 525
Hi am using Wkhtmltopdf to create PDF from Html page using c#, Asp.net. PDF are created smoothly, but when I add images to HTML it does not get displayed on PDF.
public static string HtmlToPdf(string pdfOutputLocation, string outputFilenamePrefix, string[] urls,
string[] options = null,
// string pdfHtmlToPdfExePath = "C:\\Program Files (x86)\\wkhtmltopdf\\wkhtmltopdf.exe")
string pdfHtmlToPdfExePath = "C:\\Program Files\\wkhtmltopdf\\wkhtmltopdf.exe")
{
string urlsSeparatedBySpaces = string.Empty;
try
{
//Determine inputs
if ((urls == null) || (urls.Length == 0))
throw new Exception("No input URLs provided for HtmlToPdf");
else
urlsSeparatedBySpaces = String.Join(" ", urls); //Concatenate URLs
string outputFolder = pdfOutputLocation;
string outputFilename = outputFilenamePrefix + "_" + DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss-fff") + ".PDF"; // assemble destination PDF file name
var p = new System.Diagnostics.Process()
{
StartInfo =
{
FileName = pdfHtmlToPdfExePath,
Arguments = ((options == null) ? "" : String.Join(" ", options)) + " " + urlsSeparatedBySpaces + " " + outputFilename,
UseShellExecute = false, // needs to be false in order to redirect output
RedirectStandardOutput = true,
RedirectStandardError = true,
RedirectStandardInput = true, // redirect all 3, as it should be all 3 or none
WorkingDirectory = HttpContext.Current.Server.MapPath(outputFolder),
CreateNoWindow = true
}
};
p.Start();
// read the output here...
var output = p.StandardOutput.ReadToEnd();
var errorOutput = p.StandardError.ReadToEnd();
// ...then wait n milliseconds for exit (as after exit, it can't read the output)
p.WaitForExit(60000);
// read the exit code, close process
int returnCode = p.ExitCode;
p.Close();
// if 0 or 2, it worked so return path of pdf
if ((returnCode == 0) || (returnCode == 2))
return outputFolder + outputFilename;
else
throw new Exception(errorOutput);
}
catch (Exception exc)
{
throw new Exception("Problem generating PDF from HTML, URLs: " + urlsSeparatedBySpaces + ", outputFilename: " + outputFilenamePrefix, exc);
}
}
This is my HTML code area to display Image..
<div id="Image" class="right" style="background:#333;height:15%;width:25%;">
<img id="LogoImage" runat="server" width="100%" height="100%" src="../TempLogo/chafa.jpg" />
Upvotes: 5
Views: 14605
Reputation: 35247
I had this problem, and for me the "fix" was to remove the height attribute.
Instead of
<img id="Logo" runat="server" width="100%" height="100%" src="../TempLogo/chafa.jpg" />
Try
<img id="Logo" runat="server" width="100%" src="../TempLogo/chafa.jpg" />
I don't have an explanation for this behaviour, it could be a bug.
Upvotes: 4
Reputation: 1185
I use Views to store the HTML markup for each pdf template that I want, I pass in the model to the view. Using Server.MapPath() will get you the full path to your image.
<img src="@Server.MapPath("~/path/to/your/image.jpg")" />
Upvotes: 1
Reputation: 13402
Try adding a full path for the image src. This is often due to "../TempLogo/chafa.jpg" not actually being the correct relative URL for the wkhtmltopdf working directory.
So, instead of "../TempLogo/chafa.jpg" try "C:/yourpath/TempLogo/chafa.jpg" or "file:///C:/yourpath/TempLogo/chafa.jpg" and see if that helps. If it does, your relative path is the problem.
Upvotes: 2
Reputation: 13402
I have recently seen a jpeg file fail conversion - the problem was that the image was a grayscale image.
Note that all gray images are not necessarily grayscale images - check with a program like irfanview if this is the case.
Upvotes: 0
Reputation: 11
Using pdfkit with ruby, I have found that if I send an html file with images on STDIN to wkhtmltopdf the images don't render. (ie wkhtmltopdf - toto.pdf : no images)
If I execute the EXACT same command by hand passing an html file (wkhtmltopdf toto.html toto.html), this works.
No idea why, but, I just wrote a small wrapper to call it that way and that's it.
Upvotes: 1