在项目中,我使用的iText生成PDF文档。
假设一个页面措施500pt(1个用户单元= 1点)的高度,并且我写一些文本的页面,随后的图像。
如果内容和图像要求小于450pt,文本前面的图像。 如果内容和图像超过450pt,文字被转发到下一个页面。
我的问题是:我怎么能写的图像之前获取剩余的可用空间?
在项目中,我使用的iText生成PDF文档。
假设一个页面措施500pt(1个用户单元= 1点)的高度,并且我写一些文本的页面,随后的图像。
如果内容和图像要求小于450pt,文本前面的图像。 如果内容和图像超过450pt,文字被转发到下一个页面。
我的问题是:我怎么能写的图像之前获取剩余的可用空间?
首先:添加文字和图片的网页时,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