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
我的问题是:
如何检查图像是否设置了任何旋转。
imgData.setRotation(90) 似乎对我不起作用。如何旋转。
谢谢
对于遇到此问题的任何其他人,这是 iText 团队的回应
您将不得不为此编写自己的逻辑。 iText 无法检测您的图像是否已旋转。
例如,如果您处理肖像图像,您可以创建一个方法来比较图像的宽度和高度并相应地旋转它。然而,这超出了 iText 的范围。
不幸的是,iText 7 通常不会读取(或至少不提供)该信息,ImageData
的 Rotation
属性 当前仅针对 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
信封中。
在 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
我的问题是:
如何检查图像是否设置了任何旋转。
imgData.setRotation(90) 似乎对我不起作用。如何旋转。 谢谢
对于遇到此问题的任何其他人,这是 iText 团队的回应 您将不得不为此编写自己的逻辑。 iText 无法检测您的图像是否已旋转。 例如,如果您处理肖像图像,您可以创建一个方法来比较图像的宽度和高度并相应地旋转它。然而,这超出了 iText 的范围。
iText 7 通常不会读取(或至少不提供)该信息,ImageData
的 Rotation
属性 当前仅针对 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
信封中。