我遇到这种情况,我需要将所有内容都放在 iText8 的单个 PDF 页面中。
到目前为止我已经尝试了几种方法都没有成功。
我的想法之一是创建一个元素列表,将其添加到文档中并计算每个元素的高度,然后将所有元素相加,并将高度发送到 Document 对象中的 PageSize 上。
那不起作用。
另一个想法是向表中添加行并将表添加到临时文档中,然后获取表高度并创建另一个文档,将该表高度传递给 PageSize,但这也不起作用。
还有其他想法吗?
创建一个包含 50 行的表示例:
private List<IElement> createContent() {
List<IElement> elements = new ArrayList<>();
int totalRows = 50;
Table table = new Table(UnitValue.createPercentArray(new float[] { 70f, 30f })).useAllAvailableWidth().setMarginTop(0f);
for (int i = 0; i < totalRows; i++) {
Cell coluna1 = new Cell().setPadding(0f).add(new Paragraph("" + (i + 1) + ", 1").setPadding(1f));
Cell coluna2 = new Cell().setPadding(0f).add(new Paragraph("" + (i + 1) + ", 2").setPadding(1f));
table.addCell(coluna1);
table.addCell(coluna2);
}
elements.add(table);
return elements;
}
尝试获取总高度:
private static float calculateTotalHeight(List<IElement> elements, float availableWidth) {
float totalHeight = 0f;
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
Document doc = new Document(pdfDoc, new PageSize(availableWidth, 1000));
doc.setMargins(0, 0, 0, 0);
for (IElement element : elements) {
IRenderer renderer = element.createRendererSubTree().setParent(doc.getRenderer());
LayoutResult result = renderer.layout(new LayoutContext(new LayoutArea(0, new Rectangle(availableWidth, 1000))));
totalHeight += result.getOccupiedArea().getBBox().getHeight();
}
doc.close();
return totalHeight;
}
尝试设置文档页面大小:
List<IElement> elements = createContent();
float totalHeight = calculateTotalHeight(elements, paperWidth);
PageSize pageSizeTemp = new PageSize(paperWidth, totalHeight);
由于您没有添加它为您生成的一些输出,所以我不确定出了什么问题。但这个代码片段似乎提供了所需的行为。
int pageWidth = 200;
float INF = 1e6f;
//layout in infinite space
Document doc = new Document(new PdfDocument(new PdfWriter(new ByteArrayOutputStream())), new PageSize(pageWidth, INF));
List<IElement> f = createContent();
Div container = new Div();
for (IElement iElement : f) {
container.add((BlockElement<?>) iElement);
}
LayoutContext context = new LayoutContext(new LayoutArea(1, new Rectangle(pageWidth, INF)));
DivRenderer renderer = (DivRenderer) container.createRendererSubTree();
renderer.setParent(doc.getRenderer());
LayoutResult result = renderer.layout(context);
float size = result.getOccupiedArea().getBBox().getHeight();
doc.close();
// Use the calculated size to set the just fitting page
PdfDocument doc2 = new PdfDocument(new PdfWriter("hello.pdf"));
Document doc3 = new Document(doc2, new PageSize(200, size));
//It's probably this line you are missing
doc3.setMargins(0,0,0,0);
for (IElement iElement : createContent()) {
doc3.add((BlockElement<?>) iElement);
}
doc3.close();
这导致 pdf 看起来像这样: