Я новичок в 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).
Заранее спасибо, если кто-нибудь может мне помочь.
Это легко сделать с помощью пользовательских классов 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;