Создавать PDF из ASP.NET из необработанного содержимого HTML/CSS?

Я отправляю электронные письма, у которых есть счета-фактуры, прикрепленные как PDF файлы. Я уже - в другом месте приложения - создаю счета-фактуры на странице .aspx. Я хотел бы использовать Server.Execute, чтобы вернуть выходной HTML и сгенерировать PDF. В противном случае мне пришлось бы использовать инструмент отчетности для "рисования" счета в PDF файле. Это удар по множеству причин, не в последнюю очередь из-за того, что мне придется обновлять как .aspx-страницу, так и отчет для каждого незначительного изменения. Что делать...

Ответ 1

Невозможно создать PDF файл из строки HTML непосредственно в .NET, но есть несколько сторонних элементов управления, которые хорошо работают.

У меня был успех с этим: http://www.html-to-pdf.net и это: http://www.htmltopdfasp.net

Важные вопросы:

  • Правильно ли он отображается по сравнению с 3 основными браузерами: IE, FF и Safari/Chrome?
  • Он отлично справляется с CSS?
  • Есть ли у элемента управления собственный механизм рендеринга? Если это так, отскакируйте. Вы не хотите доверять домашнему движку рендеринга - у браузеров есть достаточно сложная задача, чтобы все пикселы были идеальными.
  • Какие зависимости требует контроль третьей стороны? Чем меньше, тем лучше.

Есть несколько других, но они имеют дело с дисплеями ActiveX и т.д.

Ответ 3

Это звучит как работа для Prince. Он может принимать HTML и CSS и создавать PDF файл, который вы можете представить своим пользователям. Он поддерживает CSS3 лучше, чем большинство веб-браузеров (в штат входят Håkon Wium Lie, изобретатель CSS).

Смотрите samples, особенно те, что для страниц в Википедии, для красивого вывода, который он может сгенерировать. С авторами также есть интересный Google Tech Talk.

Изменить: Существует .NET wrapper.

Ответ 4

wkhtmltopdf - это бесплатный и классный exe для создания pdf файла из html. Его написано на С++. Но nReco htmltopdf - это оберточная библиотека dotnet для этого удивительного инструмента. Я реализовал эту библиотеку в dotnet, и было просто хорошо, что она делает все сама по себе, вам просто нужно предоставить html в качестве источника данных.

/// <summary>
/// Converts html into PDF using nReco dll and wkhtmltopdf.exe.
/// </summary>       
private byte[] ConvertHtmlToPDF()
{
  HtmlToPdfConverter nRecohtmltoPdfObj = new HtmlToPdfConverter();
  nRecohtmltoPdfObj.Orientation = PageOrientation.Portrait;
  nRecohtmltoPdfObj.PageFooterHtml = CreatePDFFooter();
  nRecohtmltoPdfObj.CustomWkHtmlArgs = "--margin-top 35 --header-spacing 0 --margin-left 0 --margin-right 0";           
  return nRecohtmltoPdfObj.GeneratePdf(CreatePDFScript() + ShowHtml() + "</body></html>");
}

Вышеприведенная функция является выдержкой из приведенного ниже сообщения ссылки, которое объясняет это подробно. HTML в PDF в ASP.Net

Ответ 5

Первоначальный вопрос заключается в преобразовании другой страницы aspx, содержащей счет-фактуру в документ PDF. Счет-фактура, вероятно, использует некоторые данные сеанса, и пользователь предлагает использовать Server.Execute() для получения кода HTML-страницы счета-фактуры, а затем для преобразования этого кода в PDF. Невозможно преобразовать URL страницы счета-фактуры, потому что во время преобразования будет создан новый сеанс, и данные сеанса будут потеряны.

Это действительно хороший способ сохранить данные сеанса во время преобразования, которые применяются в Преобразование HTML-страницы в PDF в той же сессии ASP.NET Demo библиотеки EvoPdf. Полный код С# для получения строки HTML, отображаемой на странице счета-фактуры, и для преобразования этой строки в PDF:

// Execute the invoice page and get the HTML string rendered by this page
TextWriter outTextWriter = new StringWriter();
Server.Execute("Invoice.aspx", outTextWriter);

string htmlStringToConvert = outTextWriter.ToString();

// Create a HTML to PDF converter object with default settings
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();

// Use the current page URL as base URL
string baseUrl = HttpContext.Current.Request.Url.AbsoluteUri;

// Convert the page HTML string to a PDF document in a memory buffer
byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlStringToConvert, baseUrl);

// Send the PDF as response to browser

// Set response content type
Response.AddHeader("Content-Type", "application/pdf");

// Instruct the browser to open the PDF file as an attachment or inline
Response.AddHeader("Content-Disposition", String.Format("attachment; filename=Convert_Page_in_Same_Session.pdf; size={0}", outPdfBuffer.Length.ToString()));

// Write the PDF document buffer to HTTP response
Response.BinaryWrite(outPdfBuffer);

// End the HTTP response and stop the current page processing
Response.End();

Ответ 6

Пока вы можете использовать правильный XHTML, вы также можете использовать продукт, например Alt-Soft Xml2PDF для преобразования XML ( XHTML) в PDF с помощью XSLT/XSL-FO.

Для освоения требуется немного учебной кривой, но она очень хорошо работает, как только вы ее получите!

Марк

Ответ 7

Поскольку вы создаете ответ, вы можете использовать такой инструмент, как Report.NET: http://sourceforge.net/projects/report/

Я не согласен с ответами, которые говорят, что вы не можете преобразовать непосредственно из вывода в PDF, однако, поскольку вы можете "повторно вызвать" страницу и получить HTML как поток и преобразовать его. Однако я не уверен, какой инструмент вы хотели бы использовать для этого. Другими словами, это возможно, но я не уверен, что это того стоит. Библиотеки создания PDF файлов, такие как Report.NET, даже при том, что они заставляют повторно использовать некоторую логику и нет автоматизированного преобразования, проще.

Я не пробовал этот компонент, но я слышал хорошие вещи об этом от тех, кто имеет. Модель больше похожа на HTML, но я не уверен, что вы можете просто отправить визуализированный ASPX для создания PDF: http://www.websupergoo.com/abcpdf-8.htm

Ответ 8

Если вы попытаетесь найти какое-нибудь программное обеспечение html to pdf через GOOGLE, вы получите кучу этого материала. Есть около 10 лидеров, но большинство из них используют IE dll в фоновом режиме. Только пара из них использует собственный механизм синтаксического анализа. Попробуйте компонент PDF Duo.NET в вашем проекте ASP.NET, если вы хотите создать PDF-программу. Это легкая составляющая для удобного создания PDF-обращений, отчетов, например.

Ответ 9

Я бы пошел другим путем. Предполагая, что вы используете SQL Server, используйте SSRS и создавайте PDF таким образом.

Ответ 10

Возможное минимальное решение для использования Server.Execute() для получения HTML-страницы счета-фактуры и преобразования этого кода в PDF с помощью winnovative html to pdf api для .net:

TextWriter outTextWriter = new StringWriter();
Server.Execute("Invoice.aspx", outTextWriter);

HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();

byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(outTextWriter.ToString(),
            httpContext.Current.Request.Url.AbsoluteUri);

Ответ 11

Вы можете использовать PDFSharp или iTextSharp для преобразования html в pdf. PDFSharp не является бесплатным.