Создать PDF с wkhtmltopdf и рендеринга JavaScript - PullRequest
9 голосов
/ 05 августа 2011

Я пытаюсь создать PDF-диаграмму javascript, имеющуюся в окне модели (моя диаграмма представляет собой комбинацию javascript и css в представлении .aspx).Единственное, что есть в отрендеренном PDF-файле, это статическое содержимое из окна, фактической диаграммы javascript там нет.

Мой призыв создать PDF-файл следующий:

public byte[] WKHtmlToPdf(string url)
    {
        var fileName = " - ";
        var wkhtmlDir = "C:\\Temp\\wkhtml";
        var wkhtml = "C:\\Temp\\wkhtml\\wkhtmltopdf.exe";
        var p = new Process();

        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 0mm --margin-bottom 0mm --margin-right 0mm --margin-left 0mm ";
        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;
    }

Anyидеи о том, как я могу взять диаграмму JavaScript?Возможно, версия .Net будет более подходящей, или мне придется сохранить созданную страницу в файл и передать ее в инструмент.

Спасибо.

Ответы [ 3 ]

9 голосов
/ 05 августа 2011

В нашем проекте мы делаем что-то симуляционное, с успехом.Мы используем wkhtmltopdf 0.9.9 в сочетании с Highcharts на данный момент.С jQuery flot у нас тоже был успех после небольшой настройки.В нашем проекте мы сначала визуализируем представление в строку и передаем его в wkhtml, используя его stdin.Затем мы перехватываем стандартный вывод wkhtml и передаем его обратно в браузер.

Ваши настройки wkhtml кажутся правильными, за исключением того, что мы используем stdin и stdout.Не знаю, может ли это быть проблемой.

Если вы используете одну из этих диаграмм, думаю, я смогу вам помочь.Какую диаграмму вы используете?

Последнее замечание: Wkhtmltopdf 0.10rc2, похоже, имеет некоторые проблемы с загрузкой внешних ресурсов (js / css) с локального хоста при использовании номера порта, отличного от порта 80.

6 голосов
/ 05 августа 2011

Похоже, вы пытаетесь получить выходные данные графика, который, судя по тегам, взят из скрипта Extjs 4.

Сценарий ext, вероятно, использует некоторую анимацию диаграммы и, безусловно, будет ожидать событий JavaScript, чтобы выполнить и отобразить диаграмму.Поэтому, вероятно, это не сделано к тому времени, когда установлено время по умолчанию (200 мс).

Быстрым решением было бы добавить параметр командной строки javascript-delay в командную строку:

wkhtmltopdf http://dev.sencha.com/deploy/ext-4.0.2a/examples/charts/Mixed.html --javascript-delay=2000 test.pdf, безусловно, будет работать на * nix, и аналогичная вещь должна работать на Windows.

1 голос
/ 28 февраля 2014

Я использовал wkhtmltopdf 0.9.9 и гем pdfkit ruby, и у меня возникла похожая проблема.

Я исправил это, изменив все теги, чтобы использовать абсолютные URL.Похоже, что wkhtmltopdf не знал, по какому URL-адресу была открыта страница, поэтому относительные ресурсы не загружались.Я не знаю, является ли это ограничением pdfkit или wkhtmltopdf.

Я получил идею от https://github.com/mileszs/wicked_pdf.

...