Skip to content


Subversion checkout URL

You can clone with
Download ZIP
A C#/.NET class library with .NET bindings for wkhtmltopdf.
Latest commit 20dccc5 @bambams Removing an inappropriate try...catch.
The library was swallowing AccessViolationExceptions and logging them to
stderr (a remnant from before it was a library, I hope). Clearly this is
inappropriate behavior for a class library to be doing, especially one
that originates in Windows, where most users of the library (if it even
works) will probably want to write graphical or Web applications (which
lack a stderr). I digress... Begone, try...catch!
Failed to load latest commit information.
WkHtmlToPdfDflat Removing an inappropriate try...catch.
README Added example to README.
WkHtmlToPdfDflat.sln Initial commit.


WkHtmlToPdfDflat is a work in progress .NET class library written in D♭
*errm* C# with .NET bindings for the wkhtmltopdf library. Currenty the
project is a Visual Studio 2010 project (I know, ugh), but eventually I
might get around to turning it into a command-line interface-friendly,
Mono-based project... Assuming Mono supports P/Invoke and what not...

The library doesn't seem to work properly right now. I haven't figured out
what is wrong. If you try to retrieve strings (e.g., phase description or
progress string) then you will get access violation exceptions. Otherwise,
the PDF seems to come out blank. In previous stages of this library you'd
get access violation exceptions from within the native convert function...
I don't know what is wrong, but clearly I'm not invoking the native
library properly somewhere.

Any help is appreciated. :)

== Windows ==

To use the library you'll need a copy of the wkhtmltox0.dll somewhere in
your PATH environment variable (or current working directory) so that
DllImportAttribute and P/Invoke can find it.  You can download precompiled
binaries from the Google Code project site:
<>. Or if you're brave enough then
you can attempt to build it yourself (I think it involves Qt, and in
Windows that sounds like a nightmare to me).

== Other OS ==

I'm not going to speculate on what you need for Linux yet.

== API ==

This describes the way the .NET API was originally meant to be used. I'm
not sure whether or not the semaphore is necessary (since the wkhtmltopdf
documentation doesn't seem to say whether or not the convert call blocks
until the conversion is complete (and all converter events have been

=== High-level Worker Example ===

using System;
using System.IO;
using System.Threading;
using WkHtmlToPdfDflat;

namespace Application
    class Program
        static int Main(string[] args)
            return new Program().Run(args);

        protected int progress_ = 0;
        protected int status_ = 0;

        public int Run(string[] args)
            using(var sem = new Semaphore(0, 1))
                using(var worker = new Worker())
                    worker.Error += (sender, e) => {


                        if(sem != null)

                    worker.Finished += (sender, e) => {
                        using(var fs = new FileStream(
                            var output = e.Converter.GetOutput();

                            fs.Write(output, 0, output.Length);


                        if(sem != null)

                    worker.PhaseChanged += (sender, e) => {

                    worker.ProgressChanged += (sender, e) => {
                        this.PrintProgress(e.Converter, e.Value);

                    worker.Warning += (sender, e) => {


                    var html = File.ReadAllText("example.html");

                    worker.Convert(html, null);

                        throw new Exception(
                                "WkHtmlToPdfDflat never woke me up!");

            return this.status_;

        protected void PrintProgress(
                Converter converter,
                int? progress = null)
            if(progress != null)
                this.progress_ = (int)progress;

                    "{0} - {1} - {2}%",

=== Lower-level Converter Example ===

The Converter isn't initially meant to be used directly. If you choose to
do it then you will need to make some native calls yourself (or add some
more abstractions to the library). This might change if I can ever
actually get the library working at all. ;P

Something went wrong with that request. Please try again.