在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)似乎对我不起作用。如何旋转。 感谢。
答案 0 :(得分:2)
iText 7一般不会读取(或至少不提供)该信息,Rotation
当前ImageData
属性仅为TIFF文件提取。
如果图像具有EXIF元数据并且方向正确包含在其中,您可以尝试使用适当的库读取这些元数据,并使用该方向使用iText插入图像。
一个这样的图书馆是Drew Noakes的metadata-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的范围。