A C#/.NET class library with .NET bindings for wkhtmltopdf.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


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:
<http://code.google.com/p/wkhtmltopdf/>. 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