itext 7.1 如何检查图像是否旋转

itext 7.1 how to check if image is rotated

在 itext 7.1 中,我使用以下代码将图像添加到 pdf 文档:

Document document = new Document(writerPdf);   //make a new document object
ImageData imgData = ImageDataFactory.create(imageBytes);
Image image = new Image(imgData);
document.add(image);

这对大多数图像都适用,但我遇到过一张在桌面上看起来很正常但添加到 pdf 时旋转了 -90 的图像。

imgData.getRotation() gives 0 as output

我的问题是:

  1. 如何检查图像是否设置了任何旋转。

  2. imgData.setRotation(90) 似乎对我不起作用。如何旋转。 谢谢

对于遇到此问题的任何其他人,这是 iText 团队的回应 您将不得不为此编写自己的逻辑。 iText 无法检测您的图像是否已旋转。 例如,如果您处理肖像图像,您可以创建一个方法来比较图像的宽度和高度并相应地旋转它。然而,这超出了 iText 的范围。

不幸的是,

iText 7 通常不会读取(或至少不提供)该信息,ImageDataRotation 属性 当前仅针对 TIFF 文件提取。

如果图像具有 EXIF 元数据并且方向正确包含在其中,您可以尝试使用适当的库读取这些元数据,并使用该方向使用 iText 插入图像。

一个这样的库是Drew Noakes's metadata-extractor, cf. e.g. his answer here。可以使用

通过 maven 检索它
<dependency>
    <groupId>com.drewnoakes</groupId>
    <artifactId>metadata-extractor</artifactId>
    <version>2.11.0</version>
</dependency>

有了可用的依赖项,您可以继续尝试:

Metadata metadata = ImageMetadataReader.readMetadata(new ByteArrayInputStream(imageBytes));
ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
int orientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);

double angle = 0;
switch (orientation)
{
case 1:
case 2:
    angle = 0; break;
case 3:
case 4:
    angle = Math.PI; break;
case 5:
case 6:
    angle = - Math.PI / 2; break;
case 7:
case 8:
    angle = Math.PI / 2; break;
}

Document document = new Document(writerPdf);
ImageData imgData = ImageDataFactory.create(imageBytes);
Image image = new Image(imgData);
image.setRotationAngle(angle);
document.add(image);

(来自RecognizeRotatedImage测试testOskar

(对于值 2、4、5 和 7,实际上还需要翻转图像;对于更多背景,请查看例如 here。)

为了安全起见,请考虑将 EXIF 相关代码部分包装在适当的 try-catch 信封中。