在itext中添加图像和单词时如何在新页面中添加单词

时间:2019-04-11 10:37:37

标签: java itext

我需要通过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());
        }

但是,它们被一个一个地封住了,这些单词没有添加到新页面中:

the wrong example

这是我的期望:

the right example

如何解决?

2 个答案:

答案 0 :(得分:0)

我不知道您的iText版本,但是我认为您必须创建一个PdfDocument而不是Document

答案 1 :(得分:0)

简而言之

此行为是由iText默认导致的,如果当前页面上没有足够的空间容纳图像,则它将图像浮到下一页。您可以通过将StrictImageSequence的{​​{1}}属性设置为PdfWriter来覆盖此效果。在特定情况下,您的双true也可以胜任。

详细信息

在iText中浮动图像

将图像添加到页面时,iText首先检查页面上是否留有足够的空间来容纳图像。如果没有,默认情况下,iText不会立即启动新页面来放置图像,而是仅将图像存储在局部变量中。最终由于其他原因而创建新页面时,例如通过添加足够的文本来调用页面切换或显式调用newPage,存储的图像会立即作为第一内容添加到新页面。

这可以防止在图像和文本混合在一起的情况下大部分为空的页面。

请注意,由于只有一个图像变量,因此添加另一个不合适的图像将触发生成新页面并绘制第一个等待的图像。

您的原始案例

如果您的输出是

OP's screenshot

当上一页仍为当前页面时,顶部图像已添加到文档中。它不合适,因此将其存储在变量中。然后,您的显式newPage()调用创建了一个新页面,并将来自变量的图像添加为该新页面上的第一内容,直到此后,您才想作为第一内容的“(这是B组)”,被绘制。

您的解决方法

如果您有解决方法

  

如果我两次调用documnet.newPage(),它就会起作用

但是在第一次newPage()调用过程中绘制图像之后,会生成另一个新页面。

另一方面,如果新页面没有存储的图像,则第二个newPage()将被忽略,因为默认情况下iText会禁止显示空白页面。

因此,您的解决方法在您的用例中可能会很有用。

在iText中禁用浮动图像

不过,更通用的解决方案是完全抑制iText中的浮动图像。您可以通过将newPage()属性PdfWriter设置为StrictImageSequence来实现:

true

这可能是更好的解决方案,特别是如果您最终开始在同一组的图像之间添加额外的文本。