我正在尝试将PDF转换为tif图像。我使用以下代码按格式获取图像编写器。
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("TIFF");
if (writers == null || !writers.hasNext()) {
throw new ImageWritingException();
}
当我在Eclipse中独立运行应用程序时,这很好用。但是当我将应用程序部署到linux中的tomcat服务器时, writers == null 为false,但!writers.hasNext 为true,导致抛出Exception。
我使用maven来构建战争项目。
我在pom文件中有以下依赖项。
<dependency>
<groupId>org.icepdf</groupId>
<artifactId>icepdf-core</artifactId>
</dependency>
<dependency>
<groupId>com.sun.media</groupId>
<artifactId>jai_imageio</artifactId>
</dependency>
<dependency>
<groupId>com.sun.media</groupId>
<artifactId>jai-codec</artifactId>
</dependency>
<dependency>
<groupId>javax.media</groupId>
<artifactId>jai_core</artifactId>
</dependency>
两种环境之间有什么区别?我该如何解决这个问题?
答案 0 :(得分:4)
我遇到了同样的问题并找到了根本原因。
首先让我总结一下,在dev机器上的eclipse中不会出现问题,它发生在Tomcat服务器上。
根本原因是imageio使用SPI,并且JDK中有一个基本实现(请参阅rt.jar,我们可以通过bmp和jpeg的两个插件找到它。)而我们想要的插件是jai_imageio 。罐。
使用默认配置时,Tomcat会在初始化期间为ImageIO扫描rt.jar中的插件。稍后当应用程序运行时,将不会扫描jai_imageio.jar。
因此,jai_imageio.jar中的插件不可用。在dev机器上运行时,扫描jai_imageio.jar。
下面列出了几种解决方案,我推荐第一种,因为它符合ImageIO的设计意图。
在不更改tomcat默认配置的情况下,重新扫描jar。
static { ImageIO.scanForPlugins(); }
更改tomcat配置,因此tomcat不会初始化ImageIO。 编辑文件/conf/server.xml,add appContextProtection =“false”如下:
&lt; Listener className =“org.apache.catalina.core.JreMemoryLeakPreventionListener”appContextProtection =“false”/&gt;
使用这样的配置,tomcat不会在JreMemoryLeakPreventionListener中调用ImageIO.getCacheDirectory,因此在我们的代码运行之前不会初始化ImageIO。
答案 1 :(得分:2)
Tiff支持由Java Advanced Imaging插件jai_core.jar
提供。
为了正常工作,需要将jar文件添加到JVM的ext
目录中,否则它将无法正常注册