ASP.NET MVC: визуализация представления для создания PDF: использовать iTextSharp или лучшее решение? - PullRequest
3 голосов
/ 07 декабря 2009

Я отображаю квитанцию ​​как в HTML, так и в версии для печати. HTML-версия поддерживает вкладки jQuery и т. Д., В то время как в версии для печати нет сценариев и внешних зависимостей, нет основного макета, нет дополнительных кнопок, встроенный CSS, и их можно без проблем сохранить в формате HTML.

Поскольку я использую Spark View Engine, я подумал, что, возможно, это хорошая идея для создания PDF с использованием механизма iTextSharp. Но после нескольких абзацев я решил, что это слишком громоздко, потому что а) мне пришлось бы переписать всю квитанцию ​​(исходный вид Spark длиной около 5 страниц) б) у меня были проблемы с iTextSharp с самого начала - например, нумерованные списки сохранялись с маркировкой, без indentation и indentationLeft = "20" не работали - возможно, из-за отсутствия документации, но см. (а).

Итак, мои требования к PDF очень просты: я хочу сохранить тот же HTML, но вставлять разрывы страниц между отдельными квитанциями (да, у меня есть несколько в одном документе).

Существует ли простой способ создания PDF из представления / HTML без переписывания представления с использованием странного недокументированного движка?

ОБНОВЛЕНИЕ: пробная версия сообщества HTMLDoc; я не использовал мои встроенные стили CSS, неправильно отображал символы Unicode для валют. wkhtmltopdf выбрал CSS, но не смог найти символ валюты; Я полагаю, что проблема с кодировкой решена установкой charset в utf-8. wkhtmltopdf выглядит неплохо, но мне еще предстоит выяснить, как устанавливать разрывы страниц ...

Ответы [ 3 ]

1 голос
/ 01 марта 2011
 public class Pdf : IPdf
    {
        public FileStreamResult Make(string s)
        {
            using (var ms = new MemoryStream())
            {
                using (var document = new Document())
                {
                    PdfWriter.GetInstance(document, ms);
                    document.Open();
                    using (var str = new StringReader(s))
                    {

                        var htmlWorker = new HTMLWorker(document);

                        htmlWorker.Parse(str);
                    }
                    document.Close();
                }

                HttpContext.Current.Response.ContentType = "application/pdf";
                HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=MyPdfName.pdf");
                HttpContext.Current.Response.Buffer = true;
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
                HttpContext.Current.Response.OutputStream.Flush();
                HttpContext.Current.Response.End();

                return new FileStreamResult(HttpContext.Current.Response.OutputStream, "application/pdf");
            }
        }
    }
1 голос
/ 07 декабря 2009

Если у вас есть HTML в памяти, вы можете конвертировать его в PDF. Я когда-то делал нечто подобное, используя xhtmlrenderer . Это среда JAVA, которая объединяет iText и способна преобразовывать поток HTML в PDF. Как написано в JAVA, я использовал ikvmc.exe , чтобы преобразовать файл JAR в сборку .NET и использовать его непосредственно из управляемого кода.

0 голосов
/ 15 января 2010

Наконец, использовал wkhtmltopdf, который отлично работает, когда я устанавливаю кодировку, я узнал, как настроить разрывы страниц, и он очень хорошо обрабатывает мой CSS. Проблема в том, что он не может правильно обрабатывать стандартный ввод / вывод в версии для Windows (не помню, работает он или нет, но это не работает) - может быть исправлено в последних версиях, но я согласен с временными файлами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...