Конвертация HTML в PDF средствами C#

141
31 августа 2021, 16:40

Имеется HTML-страница, состоящая из 3х таблиц(пустых), которые заполняются с помощью JavaScript с определенной периодичностью(данные таблиц обновляются). Страница простматривается с помощью WebBrowser в WPF приложениии. Необходимо сформировать PDF документ, в котором будет содержимое страницы в определенный момент времени (заполненные таблицы). Какими библиотеками это можно выполнить?

Пробовал выполнить 2мя способами первый через ExecWB

IOleServiceProvider sp = Browser.Document as IOleServiceProvider;
if (sp != null)
{
    Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
    Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E");
    const int OLECMDID_PRINT = 6;
    const int OLECMDEXECOPT_DONTPROMPTUSER = 2; const short PRINT_WAITFORCOMPLETION = 2;
    dynamic wb; 
    sp.QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, out wb);
    if (wb != null)
    {
        wb.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, PRINT_WAITFORCOMPLETION,null,null);
    }
}

Вместо null-ов можно подставить in и out параметры, при попытке указать путь сохранения получаю UnautorisedAccessException

Второй способ через PdfSharp, но там я получаю в файле только ту часть WebBrowser, которую вижу на экране, а не всю страницу целиком

Альтернативным решением может являться получение чистого Html файла, после выполнения JavaScript

Answer 1

Есть замечательный сервис для конвертации HTML в PDF средствами C#: http://wkhtmltopdf.org

Так же есть небольшая библиотека для ускорения работы: https://github.com/codaxy/wkhtmltopdf

Думаю сможете разобраться.

Answer 2

Можете попробовать использовать библиотеку для c# iTextsharp, является портом с java itext. Библиотека имеет большой функционал, а так же поддерживает метод перегонки из HTML в PDF.

Вот небольшой кусок моего кода, может поможет.

html

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type"content="text/html;charset=utf-8">
        <title></title>
    </head>
    <body>
        <table border="0" <!--style="width: 100%; padding: 10px 15px;"--> >
            <tr>
                <td><h2 align="center">Акционерное общество «одуванчик»</h2></td>
            </tr>
            <tr>
                <td>
                    <p align="center">Тема:</p>
                    <p align="center">[THEME]</p>
                </td>
            </tr>
            <tr>
                <td>        
                    <div align="right">
                        <p>Выполнил:</p>
                        <p>[AUTHOR]</p>
                    </div>
                </td>
            </tr>
            <tr>
                <td><p align="center">[CITY] [YEAR]г.</p></td>
            </tr>       
        </table>
    </body>
</html>

c#

// Read in the contents of the html file...
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append(File.ReadAllText(@"..\..\TitlePage.html"));
//string contents = File.ReadAllText(@"..\..\TitlePage.html");
// Replace the placeholders with the user-specified text
stringBuilder = stringBuilder.Replace("[THEME]", theme);
stringBuilder = stringBuilder.Replace("[AUTHOR]", authorName);
stringBuilder = stringBuilder.Replace("[CITY]", plase);
stringBuilder = stringBuilder.Replace("[YEAR]", year);
// Step 4: Parse the HTML string into a collection of elements...
//var parsedHtmlElements = HTMLWorker.ParseToList(new StringReader(contents), null);
//Path to our font
string arialuniTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF");
//Register the font with iTextSharp
iTextSharp.text.FontFactory.Register(arialuniTff);
//Create a new stylesheet
iTextSharp.text.html.simpleparser.StyleSheet ST = new iTextSharp.text.html.simpleparser.StyleSheet();
//Set the default body font to our registered font's internal name
ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.FACE, "Arial Unicode MS");
//Set the default encoding to support Unicode characters
ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.ENCODING, BaseFont.IDENTITY_H);
List<IElement> list = HTMLWorker.ParseToList(new StringReader(stringBuilder.ToString()), ST);
foreach (var element in list)
{
    doc.Add(element);
}

Сама библиотека https://sourceforge.net/projects/itextsharp/

READ ALSO
Проблема создания модели ADO.NET EDM из базы данных MySql

Проблема создания модели ADO.NET EDM из базы данных MySql

Необходима работать с базой данных MySql с помощью Entity FrameworkВерсия платформы:

125
Django перевод проект на MySQL

Django перевод проект на MySQL

Нужно перевести проект с SQLite на MySQLНастройки в settings

260
Django не дружит с MySQL

Django не дружит с MySQL

Все установил, запустил проект, создал бд в MySQL, натсроил пользователья и дал ему праваВ сеттингах:

191