我需要通过itext5将一些图像组添加到pdf中,并用单词分隔不同的组。我希望每组图像都以新页面开头,我的代码是这样的:
Document document = new Document();
byte[] imageA1 = .......;
byte[] imageA2 = .......;
byte[] imageA3 = .......;
byte[] imageA4 = .......;
byte[] imageB1 = .......;
byte[] imageB2 = .......;
try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
PdfWriter writer = PdfWriter.getInstance(document, bos);
document.open();
document.newPage();
document.add(new Paragraph("(This is groupA"));
document.add(Image.getInstance(imageA1));
document.add(Image.getInstance(imageA2));
document.add(Image.getInstance(imageA3));
document.add(Image.getInstance(imageA4));
document.newPage();
document.add(new Paragraph("(This is groupB"));
document.add(Image.getInstance(imageB1));
document.add(Image.getInstance(imageB2));
document.close();
byte[] result = bos.toByteArray();
} catch (Exception ex) {
throw new RuntimeException(ex.getLocalizedMessage());
}
但是,它们一个接一个地取向,单词没有添加到新页面:
这就是我的期望:
怎么解决?
此行为是由iText默认情况下将图像视为可以浮动到下一页的情况,如果当前页面上的图像没有足够的空间。您可以通过将StrictImageSequence
的PdfWriter
属性设置为true
来覆盖此效果。在特定情况下,你的双newPage
也可以完成这项工作。
将图像添加到页面时,iText会首先检查页面上是否有足够的空间用于图像。如果没有,iText默认情况下不会立即启动新页面来放置图像,而只是将图像存储在局部变量中。最终由于某些其他原因而创建新页面时,例如通过添加足够的文本来调用页面切换或通过显式调用newPage()
,存储的图像立即作为第一内容添加到新页面。
在大量图像和文本混合的情况下,这可以防止大多数空页面。
请注意,因为只有一个图像变量,添加另一个非拟合图像将触发新页面的生成和第一个等待图像的绘制。
如果你的输出
当前一页仍然是最新的时,顶部的图像被添加到文档中。它不适合,所以它存储在一个变量中。然后你的显式newPage()
调用创建了一个新页面,并且该变量中的图像被添加为该新页面上的第一个内容,并且此后只绘制了您想要成为第一个内容的“(这是B组)”。
如果您的解决方案
如果我两次调用document.newPage(),它就可以了
在第一次newPage()
调用过程中绘制图像后,会生成另一个新页面。
另一方面,如果新页面没有存储的图像,则忽略第二个newPage()
,因为默认情况下iText会抑制空白页面。
因此,您的解决方案可能在您的用例中很有用。
但更通用的解决方案是完全抑制iText中的浮动图像。您可以通过将PdfWriter
属性StrictImageSequence
设置为true
来实现:
writer.setStrictImageSequence(true);
在您的情况下,它可能也是更好的解决方案,特别是如果您最终开始在同一组中的图像之间添加额外的文本。
我不知道你的iText
版本,但我认为你必须创建一个PdfDocument
而不是Document
。