wkhtmltopdf – convert html code to pdf directly in C#

I know this tool looks up on a url and converts the repsponse to pdf.
How do I convert a

<html> content.. </html>

into a pdf?

I was looking at the help files on wkhtml2pdf and looks like it provides an option of stdin but I can’t really figure out how to emulate stdin.

Also if you know a tool which does a better job, please suggest me some.

Thanks a lot!

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

I just started a new project to provide a C# P/Invoke wrapper around wkhtmltopdf.

You can checkout my code at: https://github.com/pruiz/WkHtmlToXSharp

Greets.

Method 2

Take a look at Pechkin

.NET Wrapper for WkHtmlToPdf DLL, library that uses Webkit engine to
convert HTML pages to PDF.

Nuget packages:

Pechkin.Synchronized

Pechkin

Example code:

private void ConvertToPdf()
{
    var loadPath = Server.MapPath("~/HtmlTemplates");
    var loadFile = Path.Combine(loadPath, "Test.html");
    var savePath = Server.MapPath("~/Pdf");
    var saveFile = Path.Combine(savePath, DateTime.Now.ToString("HH-mm-ss.fff") + ".pdf");

    var globalConfig = new GlobalConfig()
        .SetMargins(0, 0, 0, 0)
        .SetPaperSize(PaperKind.A4);

    var pdfWriter = new SynchronizedPechkin(globalConfig);

    pdfWriter.Error += OnError;
    pdfWriter.Warning += OnWarning;

    var objectConfig = new ObjectConfig()
        .SetPrintBackground(true)
        .SetIntelligentShrinking(false);

    var pdfBuffer = pdfWriter.Convert(objectConfig, File.ReadAllText(loadFile));

    File.WriteAllBytes(saveFile, pdfBuffer);
}

private void OnWarning(SimplePechkin converter, string warningtext)
{
    throw new NotImplementedException();
}

private void OnError(SimplePechkin converter, string errortext)
{
    throw new NotImplementedException();
}

Method 3

wkhtmltopdf is a free tool, but it’s not written in .NET and it could be kind of hard to integrate into your asp.net application.

you can take a look at iTextSharp, which is free, but cannot handle any kind of html, or you can take a look at commercial tools to convert html to pdf, like ExpertPDF or ABCpdf, that can handle any html/css.

Method 4

I found a way.
You can set up another to output the normal html.
And use that url as the input value of wkhtml2pdf process.

———-Edit

public byte[] WKHtmlToPdf(string url_input)
    {
        try
        {
            var fileName = " - ";
            var wkhtmlDir = ConfigurationSettings.AppSettings["wkhtmlDir"];
            var wkhtml = ConfigurationSettings.AppSettings["wkhtml"];
            var p = new Process();

            string url = Request.Url.GetLeftPart(UriPartial.Authority) + @"/application/" + url_input;

            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.FileName = wkhtml;
            p.StartInfo.WorkingDirectory = wkhtmlDir;

            string switches = "";
            switches += "--print-media-type ";
            switches += "--margin-top 10mm --margin-bottom 10mm --margin-right 10mm --margin-left 10mm ";
            switches += "--page-size Letter ";
            p.StartInfo.Arguments = switches + " " + url + " " + fileName;
            p.Start();

            //read output
            byte[] buffer = new byte[32768];
            byte[] file;
            using (var ms = new MemoryStream())
            {
                while (true)
                {
                    int read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length);

                    if (read <= 0)
                    {
                        break;
                    }
                    ms.Write(buffer, 0, read);
                }
                file = ms.ToArray();
            }

            // wait or exit
            p.WaitForExit(60000);

            // read the exit code, close process
            int returnCode = p.ExitCode;
            p.Close();

            return returnCode == 0 ? file : null;
        }
        catch (Exception ex)
        {

           // set your exceptions here
            return null;
        }
    }

———-web.config key example

  <add key="wkhtmlDir" value="C:Program Files (x86)wkhtmltopdfbin"/>
    <add key="wkhtml" value="C:Program Files (x86)wkhtmltopdfbinwkhtmltopdf.exe"/>

The basic idea is passing url to the exe as an argument.

HTH !

Method 5

if you want to print specific part of html with Css

install Nuget packages:

Pechkin.Synchronized

StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);
  pnlprint.RenderControl(hw);
    StringReader sr = new StringReader(sw.ToString());
   string cssPath = Server.MapPath("~/css/style1.css");

    string cssString = File.ReadAllText(cssPath);
     cssPath = Server.MapPath("~/css/bootstrap.css");
    string cssString2 = File.ReadAllText(cssPath);
    cssString += cssString2;
    GlobalConfig gc = new GlobalConfig();
    byte[] pdfContent = new SimplePechkin(new GlobalConfig()).Convert(@"<html><head><style>" + cssString + "</style></head><body>" + sw.ToString() + "</body></html>");

here you can easily understand the working of wkhtmltopdf https://ourcodeworld.com/articles/read/366/how-to-generate-a-pdf-from-html-using-wkhtmltopdf-with-c-in-winforms


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x