如何添加文本到图像?如何添加文本到图像?(How to add text to an image?)

2019-05-12 09:38发布

在项目中,我使用的iText生成PDF文档。

假设一个页面措施500pt(1个用户单元= 1点)的高度,并且我写一些文本的页面,随后的图像。

如果内容和图像要求小于450pt,文本前面的图像。 如果内容和图像超过450pt,文字被转发到下一个页面。

我的问题是:我怎么能写的图像之前获取剩余的可用空间?

Answer 1:

首先:添加文字和图片的网页时,iText的,有时会改变文本内容和图片的顺序。 您可以通过使用避免这种情况:

writer.setStrictImageSequence(true);

如果你想知道“光标”的当前位置,你可以使用的方法getVerticalPosition() 不幸的是,这种方法是不是很优雅:它需要一个布尔型参数,将添加一个新行(如果true ),或者给你在当前行的位置(如果false )。

我不明白你为什么想要得到的垂直位置。 是不是因为你想有一个标题后面的图像,并且希望标题和图像在同一页面?

在这种情况下,你可以把你的文字和图像的表格单元格内,并指示iText的不拆行。 在这种情况下,iText的会将文本和图像,以正确的顺序到下一个页面,如果内容不适合当前页面。

更新:

基于在评论中添加了额外的信息,这是现在很清楚,OP想要添加的水印图像。

有达到这个两种方法,根据不同的实际需求。

方法1:

第一种方法在解释WatermarkedImages1例子。 在这个例子中,我们创建了一个PdfTemplate这是我们添加图像,以及写在该图像上一些文字。 然后,我们可以把这个包PdfTemplate图像内,并使用单一的水印加在一起的形象document.add()语句。

这是执行所有的魔法方法:

public Image getWatermarkedImage(PdfContentByte cb, Image img, String watermark) throws DocumentException {
    float width = img.getScaledWidth();
    float height = img.getScaledHeight();
    PdfTemplate template = cb.createTemplate(width, height);
    template.addImage(img, width, 0, 0, height, 0, 0);
    ColumnText.showTextAligned(template, Element.ALIGN_CENTER,
            new Phrase(watermark, FONT), width / 2, height / 2, 30);
    return Image.getInstance(template);
}

这是我们添加的图片:

PdfContentByte cb = writer.getDirectContentUnder();
document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE1), "Bruno"));
document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE2), "Dog"));
document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE3), "Fox"));
Image img = Image.getInstance(IMAGE4);
img.scaleToFit(400, 700);
document.add(getWatermarkedImage(cb, img, "Bruno and Ingeborg"));

正如你所看到的,我们有一个非常大的图像(我的妻子和我的照片)。 我们需要使之适合页面缩放这一形象。 如果你想避免这种情况,看看第二种方法。

方法2:

第二种方法在解释WatermarkedImages2例子。 在这种情况下,我们添加的每个图像的PdfPCell 。 这PdfPCell ,使其适合页面的宽度将缩放图像。 要添加水印,我们使用细胞事件:

class WatermarkedCell implements PdfPCellEvent {
    String watermark;

    public WatermarkedCell(String watermark) {
        this.watermark = watermark;
    }

    public void cellLayout(PdfPCell cell, Rectangle position,
        PdfContentByte[] canvases) {
        PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS];
        ColumnText.showTextAligned(canvas, Element.ALIGN_CENTER,
            new Phrase(watermark, FONT),
            (position.getLeft() + position.getRight()) / 2,
            (position.getBottom() + position.getTop()) / 2, 30);
    }
}

这种细胞事件可以这样使用:

PdfPCell cell;
cell = new PdfPCell(Image.getInstance(IMAGE1), true);
cell.setCellEvent(new WatermarkedCell("Bruno"));
table.addCell(cell);
cell = new PdfPCell(Image.getInstance(IMAGE2), true);
cell.setCellEvent(new WatermarkedCell("Dog"));
table.addCell(cell);
cell = new PdfPCell(Image.getInstance(IMAGE3), true);
cell.setCellEvent(new WatermarkedCell("Fox"));
table.addCell(cell);
cell = new PdfPCell(Image.getInstance(IMAGE4), true);
cell.setCellEvent(new WatermarkedCell("Bruno and Ingeborg"));
table.addCell(cell);

您将使用此方法,如果所有图像都或多或少相同的大小,如果你不想担心在页面上安装的图像。

考虑:

显然,这两种方法都有,因为设计选择是由不同的结果。 请比较所产生的PDF看出区别: watermark_template.pdf与watermark_table.pdf



文章来源: How to add text to an image?