Шаги по воспроизведению
Описание: я разрабатываю приложение 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 строки размещаются на следующей странице. Это происходит только в том случае, если текст выделен курсивом.
[b]Шаги по воспроизведению[/b] Описание: я разрабатываю приложение Java, которое использует itext и html2pdf для отображения PDF-файлов. В одном из наших PDF-файлов есть ошибка, и мы обнаружили, что проблема может быть воспроизведена с использованием только компонентов itext, что заставляет нас полагать, что это ошибка в itext. [b]версия itext[/b]: 9.1.0 – мы обнаружили эту проблему в версии itext 7.1.16 и можем воспроизвести ее до версии 9.1.0, пример кода был разработан с использованием версии 9.1.0. [b]html2pdf версия[/b]: 6.1.0 [b]Пример кода[/b] [code]package org.example;
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);
var cell = new Cell(1, 1).setKeepTogether(true).setBorder(Border.NO_BORDER); cell.add(new Paragraph(text)); return cell; }
} [/code] [b]Ожидаемое поведение[/b] Всего в этой таблице 4 строки, я ожидаю, что они будут размещены на одной странице, сразу друг за другом, без каких-либо разрывов страниц между таблицей. [b]Фактическое поведение[/b] После первой строки добавляется разрыв страницы. Остальные 3 строки размещаются на следующей странице. [b]Это происходит только в том случае, если текст выделен курсивом.[/b]