Как управлять данными переполнения в itext 7 при использовании canvasrenderer - PullRequest
0 голосов
/ 08 ноября 2019

Я использую iText 7 для генерации PDF-файла из HTML-файла, который сохраняется в базе данных.

Я использовал следующий код для генерации PDF, но половина таблицы, которая находится внутри HTML-файла, игнорируется. ,Я предполагаю, что размер IBlockElement, который содержит таблицу, больше, чем размер холста.

Есть идеи, как решить проблему?

List<IElement> elements = (List<IElement>)HtmlConverter.ConvertToElements(html);   
for (int k = 0; k < elements.Count; k++)
    {

        if (!renderer.IsFull())
        {
            canvas.Add((IBlockElement)elements[k]);
        }
        else
        {
            page = pdfDoc.AddNewPage();
            pdfCanvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(),pdfDoc);
            rectangle = new Rectangle(offset, offset, pageWidth, pageHeight);
            pdfCanvas.Rectangle(rectangle);
            pdfCanvas.Stroke();
            canvas = new iText.Layout.Canvas(pdfCanvas, pdfDoc, rectangle);
            renderer = new MyCanvasRenderer(canvas);
            canvas.SetRenderer(renderer);
        }
    }

Реализация MyCanvasRenderer:

class MyCanvasRenderer : CanvasRenderer {
    protected bool full = false;

    public MyCanvasRenderer(Canvas canvas) : base(canvas) {
    }

    public override void AddChild(IRenderer renderer) {
        base.AddChild(renderer);
        full = true.Equals(GetPropertyAsBoolean(Property.FULL));
    }

    public bool IsFull() {
        return full;
    }
}

1 Ответ

1 голос
/ 09 ноября 2019
Класс

Canvas в первую очередь предназначен для случаев, когда вам необходимо добавить элементы в определенную предопределенную область на странице / XObject, и не предназначен для переполнения вашего контента в следующих областях.

Как описаносценарий использования - это просто преобразование HTML в PDF, соответствующий API для использования - это еще один метод HtmlConverter, который позволяет преобразовать HTML в PDF в одну строку:

HtmlConverter.ConvertToPdf(html, pdfWriter);

UPD : разъяснения по дополнительным требованиям от @ Saeed

Различные поля для первой страницы

CSS позволяет указывать поля страницы с @pageСМИ, и эти заявления подобраны pdfHTML. Вот пример спецификации полей страницы и как настроить их для первой страницы:

@page {
    margin-top: 100pt;
    margin-left: 36pt;
    margin-right: 36pt;
    margin-bottom: 36pt;
}

@page:first {
    margin-top: 100pt;
    margin-left: 36pt;
    margin-right: 36pt;
    margin-bottom: 36pt;
}

Как избежать разделения таблицы по нескольким страницам

CSS имеет свойство page-break-inside, управляющее страницейвнешний вид элементов. В частности, вас интересует объявление page-break-inside: avoid;, которое предотвращает разбиение элемента по страницам.

Вы можете применить это объявление ко всем таблицам в вашем документе:

table {
    page-break-inside: avoid;
}

В качестве альтернативы, вы можетеможет создать свой собственный класс и применять его только при необходимости:

.avoid-page-breaks {
    page-break-inside: avoid;
}

<table class="avoid-page-breaks">
...
</table>

Третий вариант - применить этот стиль к встроенной таблице:

<table style="page-break-inside: avoid;">
...
</table>
...