Java-iText7-(3) 绘制图片(使用构建模块)

iText绘制图片有两种方式,一种是利用封装好的构建模块Image,另一种是使用底层绘制方法(Canvas)。这里我们将介绍使用构建模块Image来绘制图片的方法。

1. 基础使用方法

iText中图片使用Image对象来存储。在需要插入的位置,使用Document对象的add()方法便可以插入图片。Image与Paragraph有许多相似的用法,这方便我们进行触类旁通。基础的用法如下面的代码片段所示。

PdfWriter writer = new PdfWriter("path/to/pdf.pdf");
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);

Image dogImg = new Image(ImageDataFactory.create("path/to/image/dog.jpeg"));
Image catImg = new Image(ImageDataFactory.create("path/to/image/cat.jpeg"));

document.add(dogImg);
document.add(catImg);

document.close();
普通绘制两张图片

1-3行、11行是PDF文档的创建与关闭。第5、6行分别读取并创建了一个图片Image对象。第8、9行分别将创建的图片绘制在PDF页面上。创建图片对象时,我们使用ImageDataFactory.create(String filename)方法,传入图片的路径来读取。Image支持的图片类型如下面列表所示。

  • gif
  • jpeg
  • jpeg2000_1
  • jpeg2000_2
  • png
  • wmf
  • bmp
  • tiff_1
  • tiff_2
  • jbig2

默认的绘制情况下,图片按照100%尺寸绘制。图片的绘制长度=图片像素长度 / 图片绘制DPI * 72,宽度计算方式相似. DPI的含义是每平方英寸像素点数量,通常图片的DPI为72、96等,打印机的DPI通常是300、600. 如果图片没有指定绘制DPI,会按照默认的72DPI进行绘制。举例,对于一张长度1280像素的图片,在300DPI下,实际的绘制长度是1280/300*72=307.2. 对于一张A4纸,它的长度是595。那么这张图片的长度大概占页面长度的一半多一点。

2. 调整图片尺寸

2-1. 分别设置绝对宽度高度数值

图片的宽度和高度可以分别通过image.setWidth(float width)和image.setHeight(float height)进行调整。传入的数值是绘制宽度/高度,并非像素大小。我们可以通过image.getImageWidth()和image.getImageHeight()获取当前图片的宽度和高度。这方便我们进行图片尺寸的等比例缩放。需要指出的是,当图片的尺寸大于其实际尺寸时,打印的效果可能会出现失真。

document.add(dogImg); // 原始大小图片
Image dogHalfImg = new Image(ImageDataFactory.create("path/to/image/dog.jpeg"));
float dogHalfImgWidth = dogHalfImg.getImageWidth()/2;
float dogHalfImgHeight = dogHalfImg.getImageHeight()/2;
document.add(dogHalfImg
        .setWidth(dogHalfImgWidth)
        .setHeight(dogHalfImgHeight)); // 宽度高度各缩小一半
上面的图片是原始大小的,下面的图片是宽度高度各缩小一半的

2-2. 使用比例缩放

对于使用相对原始大小的比例缩放,使用image.scale(float widthRatio, float heightRatio)方法会相对简单一些。该方法接受两个参数,宽度的缩放比例和高度的缩放比例。比例为1.0代表原始大小,0.0-1.0部分是缩小,1.0以上是放大。

document.add(dogImg);
Image dogRatioImg = new Image(ImageDataFactory.create("path/to/image/dog.jpeg"));
document.add(dogRatioImg
        .scale(0.67F, 0.67F));
上面的图片是原始大小的,下面的图片宽度高度是原始大小的三分之二

2-3. 自动缩放

使用setAutoScale(true)可以设置图片进行自动缩放。自动缩放会根据文档大小进行宽高等比例缩放。它在余下的空白宽度和空白高度中选择一个更小的,然后按照这个大小等比例缩放图片。

document.add(dogImg);
Image dogAutoRatioImg = new Image(ImageDataFactory.create("path/to/image/dog.jpeg"));
document.add(dogAutoRatioImg
        .setAutoScale(true));
上面的图片是原始大小,下面的图片是自动缩放的大小。由于页面高度的空白余量更大,缩放取页面宽度作为基准,高度等比例缩放。

自动缩放由于不能直接控制尺寸大小,缩放可能会产生意想不到的效果。例如,在页面底部的图片会按照剩余高度进行缩放。更建议采用指定缩放大小的方式进行。

3. 旋转图片

图片可以使用image.setRotationAngle(float radiusAngle)来进行旋转。旋转的角度为弧度制,360°角度对应2π弧度。正数为逆时针旋转,负数为顺时针旋转。

Image dogRotationImg = new Image(ImageDataFactory.create("path/to/image/dog.jpeg"));
document.add(dogRotationImg
        .setRotationAngle(Math.PI / 2));
document.add(dogRotationImg);
旋转角度为π/2,相当于逆时针旋转90度

4. 自由位置的图片

和Paragraph类相似,我们可以使用image.setFixedPosition(float left, float bottom)方法来指定图片的位置。两个参数left和bottom分别指的是图片左下角到页面左边缘和底部的距离。后放置的图片可能会盖住下方已有的内容。

Image dogFloatImg = new Image(ImageDataFactory.create("path/to/image/dog.jpeg"));
document.add(dogFloatImg
        .setFixedPosition(0, pdf.getDefaultPageSize().getHeight()-100));
上面的图片是浮动位置的图片,由于它在原始图片后面绘制,因此覆盖在了原始图片上面

5. 段落中的图片

很简单,将创建好的Image对象添加入Paragraph对象即可。这一点与Text文本加入Paragraph是相似的。

Paragraph para = new Paragraph();
Text textBefore = new Text("This paragraph has an image.");
Image dogParaImg = new Image(ImageDataFactory.create("path/to/image/dog.jpeg"));
Text textAfter = new Text("which shows a cure puppy.");
para.add(textBefore).add(dogParaImg).add(textAfter);
document.add(para);
大图片一般需要先缩放到合适的大小,否则会超出显示区域

发表评论