IText 7 pdhHtml сохраняет строки таблицы вместе

Я новичок в iText 7, я разрабатываю спа-проект (asp.net, C# и angularjs), где мне нужно реализовать отчет для существующей html-страницы. Я обнаружил, что iText 7 (.Net) имеет простой способ реализовать Это. Используя приведенный ниже код строки, он возвращает мне массив байтов, и я могу легко показать его в браузере, так как pdf также можно загрузить.

var memStream = new MemoryStream();
ConverterProperties converterProperties = new ConverterProperties();
converterProperties.SetFontProvider(fontProvider);              converterProperties.SetBaseUri(System.AppDomain.CurrentDomain.BaseDirectory);
HtmlConverter.ConvertToPdf(htmlText, memStream, converterProperties);

В моем необработанном html есть несколько таблиц html (каждая таблица имеет определенные строки), и я хочу сохранить их на странице (я имею в виду, что если строки таблицы не помещаются на одной странице, тогда начните со следующей страницы). У меня есть решение, как показано ниже

Paragraph p = new Paragraph("Test");
PdfPTable table = new PdfPTable(2);
for (int i = 1; i < 6; i++) {
    table.addCell("key " + i);
    table.addCell("value " + i);
}
for (int i = 0; i < 40; i++) {
    document.add(p);
}
// Try to keep the table on 1 page
table.setKeepTogether(true);
document.add(table);

Но в моем случае я не могу реализовать такой способ, потому что контент уже существует в таблицах html (на моей существующей странице html).

Заранее спасибо, если кто-нибудь может мне помочь.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
875
2

Ответы 2

Это легко сделать с помощью пользовательских классов TagWorkerFactory и TableTagWorker. Взгляните на примеры кода ниже.

Первое, что нам нужно сделать, это создать настраиваемый TableTagWorker, который сообщает iText, что таблица должна храниться вместе. Мы делаем это, используя упомянутый вами код: table.setKeepTogether (истина).

class CustomTableTagWorker extends TableTagWorker{

    public CustomTableTagWorker(IElementNode element, ProcessorContext context) {
        super(element, context);
    }

    @Override
    public void processEnd(IElementNode element, ProcessorContext context) {
        super.processEnd(element, context);
        ((com.itextpdf.layout.element.Table) getElementResult()).setKeepTogether(true);
    }
}

Как видите, единственное, что мы изменили в нашем настраиваемом TableTagWorker, - это то, что он должен удерживать таблицу вместе.

Следующим шагом будет создание пользовательского TagWorkerFactory, который сопоставляет наш CustomTableTagWorker с тегом стол в HTML. Делаем это так:

class CustomTagWorkerFactory extends DefaultTagWorkerFactory{
    @Override
    public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
        if (tag.name().equalsIgnoreCase("table")) {
            return new CustomTableTagWorker(tag, context); // implements ITagWorker
        }
        return super.getCustomTagWorker(tag, context);
    }
}

Все, что мы здесь делаем, это сообщаем iText, что если он найдет тег стол, он должен передать элемент в CustomTableTagWorker, чтобы преобразовать его в объект PDF (где setKeepTogether == true).

Последний шаг - регистрация этого CustomTagWorkerFactory на нашем КонвертерСвойства.

ConverterProperties converterProperties = new ConverterProperties();
converterProperties.setTagWorkerFactory(new CustomTagWorkerFactory());
HtmlConverter.convertToPdf(HTML, new FileOutputStream(DEST), converterProperties);

Используя эти образцы кода, я смог создать выходной PDF-файл, в котором таблицы, если они достаточно малы для отображения на всей странице, никогда не будут разделены на несколько страниц.

У меня была аналогичная проблема с попыткой сохранить вместе контент в div. Я применил следующее свойство css, и это сохранило все вместе. Это работало с itext7 pdfhtml.

page-break-inside: avoid;

Другие вопросы по теме