Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Image display in HTML but not in PDF using WKHTMLTOPDF

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" />

like image 859
Constant Learner Avatar asked Apr 23 '13 13:04

Constant Learner


3 Answers

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.

like image 192
Joel Peltonen Avatar answered Oct 30 '22 18:10

Joel Peltonen


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.

like image 35
Ed Guiness Avatar answered Oct 30 '22 17:10

Ed Guiness


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.

like image 1
Loic Avatar answered Oct 30 '22 18:10

Loic