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

时间:2018-01-29 20:31:07

标签: itext itext7

在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)似乎对我不起作用。如何旋转。 感谢。

2 个答案:

答案 0 :(得分:2)

iText 7一般不会读取(或至少不提供)该信息,Rotation当前ImageData属性仅为TIFF文件提取。

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

一个这样的图书馆是Drew Noakesmetadata-extractor,参见例如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信封中。

答案 1 :(得分:0)

对于遇到此问题的其他人,这是来自iText团队的回复 你必须为此编写自己的逻辑。 iText无法检测您的图像是否已旋转。 例如,如果您使用肖像图像,则可以创建一种方法,将图像的宽度与其高度进行比较并相应地旋转。但是这超出了iText的范围。