HTML для PDF-страницы с PdfSharp и HtmlRenderer

Я пытаюсь преобразовать HTML в PDF, используя PdfSharp и HtmlRenderer. Это часть кода:

private byte[] CreateHtmlContent()
{
    string htmlContent = File.ReadAllText(@"htmlExample.txt");

    using (MemoryStream ms = new MemoryStream())
    {
        PdfDocument pdfDocument = new PdfDocument();
        PdfDocument pdf = PdfGenerator.GeneratePdf(htmlContent, PdfSharp.PageSize.A4, 60);
        pdf.Save(ms);
        res = ms.ToArray();
    }
    return res;
}

Все работает отлично, кроме разрыва страницы. На некоторых страницах у меня есть результат, как на этом изображении

HTML page break

Можно ли это исправить? HTML-контент - это простой html, который содержит только заголовки и абзацы, а также другие теги. У меня не было этой проблемы с iTextSharp, но в этом проекте я должен использовать PdfSharp и MigraDoc.

Ответ 1

У меня была аналогичная задача, и я решил, что нашел этот запрос на github: https://github.com/ArthurHub/HTML-Renderer/pull/41

Вы можете установить свойство custom-css

td { page-break-inside: avoid; }

на всех элементах или селекторах, которые вы хотите (td, p,.my-class и т.д.) для управления разбиением страницы.

Вы можете использовать значение "авто", если вы хотите, чтобы библиотека контролировала разбиение страницы на определенные элементы

td { page-break-inside: auto; }

Также есть пример для разбиения страницы в тексте.

Ответ 2

Это немного поздно, но я столкнулся с той же проблемой. Проблема заключается в марже, заданном для вызова GeneratePdf. Удалите его, и все в порядке.

    PdfDocument pdf = PdfGenerator.GeneratePdf(htmlContent, PdfSharp.PageSize.A4);

Ответ 3

Это также решается добавлением соответствующего тега DIV, если вы не используете таблицы.

foreach (DataRow row in group)
            {
                HTMLoutput += "<div style=\"page-break-inside: avoid\"> ";
                HTMLoutput += "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
                HTMLoutput += "</div>";
            }

Ответ 4

Вы можете использовать предварительную версию в Nuget (1.5.1-beta1), а затем:

td { page-break-inside: avoid; }