Описание: я разрабатываю приложение Java, которое использует itext и html2pdf для отображения PDF-файлов. В одном из наших PDF-файлов есть ошибка, и мы обнаружили, что проблема может быть воспроизведена с использованием только компонентов itext, что заставляет нас полагать, что это ошибка в itext.
версия itext: 9.1.0 – мы обнаружили эту проблему в версии itext 7.1.16 и можем воспроизвести ее до версии 9.1.0, пример кода был разработан с использованием версии 9.1.0.
html2pdf версия: 6.1.0
Пример кода
Код: Выделить всё
package org.example;
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
import com.itextpdf.io.font.constants.StandardFonts;
import com.itextpdf.kernel.colors.Color;
import com.itextpdf.kernel.colors.DeviceRgb;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.borders.Border;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.font.FontProvider;
import com.itextpdf.layout.properties.UnitValue;
import java.io.File;
public class Main {
public static final String DEST = "./target/sandbox/tables/simple_table9.pdf";
public static void main(String[] args) throws Exception {
File file = new File(DEST);
file.getParentFile().mkdirs();
new Main().manipulatePdf(DEST);
}
protected void manipulatePdf(String dest) throws Exception {
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
pdfDoc.setDefaultPageSize(PageSize.A4.rotate());
Document doc = new Document(pdfDoc);
doc.add(new Paragraph("With 3 columns:"));
UnitValue[] unitValues = new UnitValue[]{
new UnitValue(UnitValue.POINT, 80),
new UnitValue(UnitValue.POINT, -1),
new UnitValue(UnitValue.POINT, 70),
new UnitValue(UnitValue.POINT, 40),
new UnitValue(UnitValue.POINT, 50),
new UnitValue(UnitValue.POINT, 55),
new UnitValue(UnitValue.POINT, 50),
new UnitValue(UnitValue.POINT, 55)
};
ConverterProperties converterProperties = new ConverterProperties();
final FontProvider fontProvider = new DefaultFontProvider(false, false, false);
fontProvider.addFont(StandardFonts.HELVETICA_OBLIQUE);
fontProvider.addFont(StandardFonts.HELVETICA);
converterProperties.setFontProvider(fontProvider);
doc.setFontProvider(fontProvider);
PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA);
doc.setFont(font);
doc.setFontColor(Color.convertRgbToCmyk(new DeviceRgb(255, 0, 0)));
Table table = new Table(unitValues);
doc.setMargins(20, 0, 20, 0);
table.setFontSize(9F);
table.setFixedLayout();
table.useAllAvailableWidth();
table.setKeepTogether(true);
table.setMarginTop(5);
table.setMarginLeft(-25);
table.setPadding(0);
// ROW 1
table.addCell(createCell("1"));
table.addCell(createCell("Eerste lijn beschrijving"));
table.addCell(createCell(""));
table.addCell(createCell("m²"));
table.addCell(createCell("1.050,0000"));
table.addCell(createCell("42.000,00"));
table.addCell(createCell("20.0%"));
table.addCell(createCell("52.500,00"));
// ROW 2
table.addCell(createCell(""));
table.addCell(createCell("Administratie").simulateItalic());
table.addCell(createCell("27.Structuurelementen staal").simulateItalic());
table.addCell(createCell("pallet").simulateItalic());
table.addCell(createCell("1.050,0000").simulateItalic());
table.addCell(createCell("42.000,00").simulateItalic());
table.addCell(createCell("20.0%").simulateItalic());
table.addCell(createCell("52.500,00").simulateItalic());
// ROW 2
// table.addCell(createCell(""));
// table.addCell(createCell("Administratie"));
// table.addCell(createCell("27.Structuurelementen staal"));
// table.addCell(createCell("pallet"));
// table.addCell(createCell("1.050,0000"));
// table.addCell(createCell("42.000,00"));
// table.addCell(createCell("20.0%"));
// table.addCell(createCell("52.500,00"));
// ROW 3
table.addCell(createCell("27.22"));
table.addCell(createCell("staalconstructie - thermisch verzinkt profielstaal - buitenconstructie kantoor"));
table.addCell(createCell(""));
table.addCell(createCell("kg"));
table.addCell(createCell("1,0000"));
table.addCell(createCell("3.751,44"));
table.addCell(createCell("11.5%"));
table.addCell(createCell("4.239,13"));
// ROW 4
table.addCell(createCell(""));
table.addCell(new Cell().add(new Paragraph("aankoop basismateriaal")).setPaddingLeft(15F).setBorder(Border.NO_BORDER));
table.addCell(createCell("27.Structuurelementen staal"));
table.addCell(createCell("kg"));
table.addCell(createCell("1,0500"));
table.addCell(createCell("0,91"));
table.addCell(createCell("11.5%"));
table.addCell(createCell("1,03"));
doc.add(table);
doc.close();
}
private Cell createCell(String text) {
var cell = new Cell(1, 1).setKeepTogether(true).setBorder(Border.NO_BORDER);
cell.add(new Paragraph(text));
return cell;
}
}
Всего в этой таблице 4 строки, я ожидаю, что они будут размещены на одной странице, сразу друг за другом, без каких-либо разрывов страниц между таблицей.
Фактическое поведение
После первой строки добавляется разрыв страницы. Остальные 3 строки размещаются на следующей странице.
Это происходит только в том случае, если текст выделен курсивом.
Подробнее здесь: https://stackoverflow.com/questions/795 ... reak-is-ad