As I try to convert PDF to TIF via PDFBox in WebSphere 8, I got the error message during the conversion process:
1 2 | [Line:198][org.apache.pdfbox.tools.imageio.ImageIOUtil.writeImage]No ImageWriter found for 'tif' format [Line:206][org.apache.pdfbox.tools.imageio.ImageIOUtil.writeImage]Supported formats: BMP bmp jpg JPG wbmp jpeg png PNG JPEG WBMP GIF gif |
Lacking of jai-imageio-core jar file in your classpath must get this error message.
But I have add jai-imageio-core dependency in pom.xml.
Snippet of pom.xml looks like:
1 2 3 4 5 6 7 8 9 10 11 12 | <!-- for generating tif file --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox-tools</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>com.github.jai-imageio</groupId> <artifactId>jai-imageio-core</artifactId> <version>1.3.1</version> </dependency> |
Therefore, I try to print log to figure out the weird problem:
1 2 3 4 5 6 7 8 9 10 11 | try { Enumeration<URL> urls = Thread.currentThread().getContextClassLoader() .getResources("META-INF/services/javax.imageio.spi.ImageWriterSpi"); while (urls.hasMoreElements()) { log.info("[convertToTiff] url = " + urls.nextElement().toString()); } } catch (IOException e1) { e1.printStackTrace(); throw new RuntimeException(e1); } |
The jar file exists in my ear file ! What happened?
1 | [convertToTiff] url = wsjar:file:/usr/IBM/WebSphere/AppServer/profiles/AppSrv03/installedApps/FDCSRA205Node03Cell/yuantalife-ecp-manage.ear/yuantalife-ecp-manage-war-0.1.0-SNAPSHOT.war/WEB-INF/lib/jai-imageio-core-1.3.1.jar!/META-INF/services/javax.imageio.spi.ImageWriterSpi |
Here is my source code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | package albert.practice.file; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Enumeration; import javax.imageio.ImageIO; import lombok.extern.slf4j.Slf4j; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.tools.imageio.ImageIOUtil; @Slf4j public class PdfFileToTif { private final float dpi = 300f; public static void main(String[] args) { File pdfFile = new File("D:\\dropbox\\Getting Started.pdf"); String destination = "D:\\dropbox\\"; PdfFileToTif test = new PdfFileToTif(); test.checkImageIoJarFile(); test.convertPdfToTif(pdfFile, destination); } public void convertPdfToTif(File pdfFile, String destination) { if (!isFileExisted(pdfFile)) { throw new RuntimeException("File not found ! (" + pdfFile.getAbsolutePath() + ")"); } String pdfFileName = pdfFile.getName(); try { // load PDF document PDDocument document = PDDocument.load(pdfFile); // create PDF renderer PDFRenderer renderer = new PDFRenderer(document); // go through each page of PDF, and generate TIF for each PDF page. for (int i = 0; i < document.getNumberOfPages(); i++) { // Returns the given page as an RGB image with 300 DPI. BufferedImage image = renderer.renderImageWithDPI(i, dpi, ImageType.BINARY); // Assign the file name of TIF String fileName = pdfFileName + "_" + String.format("%02d", i + 1); log.debug("Generating " + fileName + ".tif to " + destination); // Writes a buffered image to a file using the given image format. ImageIOUtil.writeImage(image, destination + fileName + ".tif", Math.round(dpi)); image.flush(); } log.debug("PDF to TIF conversion well done!"); } catch (IOException e) { throw new RuntimeException(e); } } /** * 判斷檔案是否存在 * * @param file * @return true - 檔案存在; false - 檔案不存在 */ private Boolean isFileExisted(File file) { Boolean isExisted = Boolean.FALSE; isExisted = (file.exists() && (!file.isDirectory())); return isExisted; } private void checkImageIoJarFile() { try { Enumeration<URL> urls = Thread.currentThread().getContextClassLoader() .getResources("META-INF/services/javax.imageio.spi.ImageWriterSpi"); while (urls.hasMoreElements()) { log.info("[convertToTiff] urls = " + urls.nextElement().toString()); } } catch (IOException e1) { e1.printStackTrace(); throw new RuntimeException(e1); } } } |
How-to
The root cause is not so clear. It may results from WebSphere's classloading problem.
Hence, I find an API to scans for plug-ins on the application class path, loads their service provider classes, and registers a service provider instance for each one found with the IIORegistry. This strange problem had been resolved as I add ImageIO.scanForPlugins();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | package albert.practice.file; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Enumeration; import javax.imageio.ImageIO; import lombok.extern.slf4j.Slf4j; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.tools.imageio.ImageIOUtil; @Slf4j public class PdfFileToTif { private final float dpi = 300f; public static void main(String[] args) { File pdfFile = new File("D:\\dropbox\\Getting Started.pdf"); String destination = "D:\\dropbox\\"; PdfFileToTif test = new PdfFileToTif(); test.checkImageIoJarFile(); test.convertPdfToTif(pdfFile, destination); } public void convertPdfToTif(File pdfFile, String destination) { if (!isFileExisted(pdfFile)) { throw new RuntimeException("File not found ! (" + pdfFile.getAbsolutePath() + ")"); } String pdfFileName = pdfFile.getName(); try { // load PDF document PDDocument document = PDDocument.load(pdfFile); // Scans for plug-ins on the application class path, loads their service provider // classes, and registers a service provider instance for each one found with the // IIORegistry. ImageIO.scanForPlugins(); // create PDF renderer PDFRenderer renderer = new PDFRenderer(document); // go through each page of PDF, and generate TIF for each PDF page. for (int i = 0; i < document.getNumberOfPages(); i++) { // Returns the given page as an RGB image with 300 DPI. BufferedImage image = renderer.renderImageWithDPI(i, dpi, ImageType.BINARY); // Assign the file name of TIF String fileName = pdfFileName + "_" + String.format("%02d", i + 1); log.debug("Generating " + fileName + ".tif to " + destination); // Writes a buffered image to a file using the given image format. ImageIOUtil.writeImage(image, destination + fileName + ".tif", Math.round(dpi)); image.flush(); } log.debug("PDF to TIF conversion well done!"); } catch (IOException e) { throw new RuntimeException(e); } } /** * 判斷檔案是否存在 * * @param file * @return true - 檔案存在; false - 檔案不存在 */ private Boolean isFileExisted(File file) { Boolean isExisted = Boolean.FALSE; isExisted = (file.exists() && (!file.isDirectory())); return isExisted; } private void checkImageIoJarFile() { try { Enumeration<URL> urls = Thread.currentThread().getContextClassLoader() .getResources("META-INF/services/javax.imageio.spi.ImageWriterSpi"); while (urls.hasMoreElements()) { log.info("[convertToTiff] urls = " + urls.nextElement().toString()); } } catch (IOException e1) { e1.printStackTrace(); throw new RuntimeException(e1); } } } |
Reference
[1] http://stackoverflow.com/questions/17178591/how-to-add-tiff-imagereader-to-those-registered-in-grails