Search code examples
javapdftiffgraphics2djavax.imageio

Converting pdf file to tiff


I am trying to convert a colored image or not image PDF file in to a multi-page tiff file. For that i have written some code but this code covert PDF file to tiff file which is black and white. I need the tiff file should be in colored. So what changes should i make so that i can get a colored tiff file.

public void btnConvertToTiffActionPerformed(ActionEvent e) throws InterruptedException {
        final double FAX_RESOLUTION = 200.0;
        final double PRINTER_RESOLUTION = 300.0;
        // This compression type may be wpecific to JAI ImageIO Tools
        final String COMPRESSION_TYPE_GROUP4FAX = "CCITT T.6";
        Iterator<ImageWriter> iterator = ImageIO.getImageWritersByFormatName("tiff");
        if (!iterator.hasNext()) {
            System.out.println(
                "ImageIO missing required plug-in to write TIFF files. " +
                "You can download the JAI ImageIO Tools from: " +
                "https://jai-imageio.dev.java.net/");
            return;
        }
        boolean foundCompressionType = false;
        for(String type : iterator.next().getDefaultWriteParam().getCompressionTypes()) {
            if (COMPRESSION_TYPE_GROUP4FAX.equals(type)) {
                foundCompressionType = true;
                break;
            }
        }
        if (!foundCompressionType) {
            System.out.println(
                "TIFF ImageIO plug-in does not support Group 4 Fax " +
                "compression type ("+COMPRESSION_TYPE_GROUP4FAX+")");
            return;
        }

        Document document = new Document();
        try {
            document.setFile(file.getAbsolutePath());
        } catch (PDFException ex) {
            System.out.println("Error parsing PDF document " + ex);
        } catch (PDFSecurityException ex) {
            System.out.println("Error encryption not supported " + ex);
        } catch (FileNotFoundException ex) {
            System.out.println("Error file not found " + ex);
        } catch (IOException ex) {
            System.out.println("Error handling PDF document " + ex);
        }
        try {
            // save page caputres to file.
            File file = new File("D:\\pdfbox\\imageCapture.tif");
            ImageOutputStream ios = ImageIO.createImageOutputStream(file);
            ImageWriter writer = ImageIO.getImageWritersByFormatName("tiff").next();
            writer.setOutput(ios);
            // Paint each pages content to an image and write the image to file
            for (int i = 0; i < document.getNumberOfPages(); i++) {
                final double targetDPI = PRINTER_RESOLUTION;
                float scale = 1.0f;
                float rotation = 0f;
                // Given no initial zooming, calculate our natural DPI when
                // printed to standard US Letter paper
                PDimension size = document.getPageDimension(i, rotation, scale);
                double dpi = Math.sqrt((size.getWidth()*size.getWidth()) +
                                       (size.getHeight()*size.getHeight()) ) /
                             Math.sqrt((8.5*8.5)+(11*11));
                // Calculate scale required to achieve at least our target DPI
                if (dpi < (targetDPI-0.1)) {
                    scale = (float) (targetDPI / dpi);
                    size = document.getPageDimension(i, rotation, scale);
                }
                int pageWidth = (int) size.getWidth();
                int pageHeight = (int) size.getHeight();
                int[] cmap = new int[] { 0xFF000000, 0xFFFFFFFF };
                IndexColorModel cm = new IndexColorModel(8, cmap.length, cmap, 0, true, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
                BufferedImage image = new BufferedImage(
                    pageWidth, pageHeight, BufferedImage.TYPE_BYTE_BINARY, cm);
                Graphics g = image.createGraphics();
                document.paintPage(
                    i, g, GraphicsRenderingHints.PRINT, Page.BOUNDARY_CROPBOX,
                    rotation, scale);
                g.dispose();              
                // capture the page image to file
                IIOImage img = new IIOImage(image, null, null);
                ImageWriteParam param = writer.getDefaultWriteParam();
                param.setCompressionMode(param.MODE_EXPLICIT);
                param.setCompressionType(COMPRESSION_TYPE_GROUP4FAX);
                if (i == 0) {
                    writer.write(null, img, param);
                }
                else {
                    writer.writeInsert(-1, img, param);
                }
                image.flush();
            }            
            ios.flush();
            ios.close();
            writer.dispose();
        }
        catch(IOException ex) {
            System.out.println("Error saving file " + ex);
            ex.printStackTrace();
        }        
        // clean up resources
        document.dispose();
        System.out.println("Done");
    }

Solution

  • import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.*;
    import javax.imageio.metadata.IIOMetadata;
    import javax.imageio.stream.ImageOutputStream;
    import javax.swing.*;
    import javax.swing.border.EmptyBorder;
    import javax.swing.filechooser.FileNameExtensionFilter;
    
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.rendering.ImageType;
    import org.apache.pdfbox.rendering.PDFRenderer;
    public void convertToTiff() {
        try {    
            PDDocument document = PDDocument.load(pdf-file path);
            // save page caputres to file.
            File file = new File(D:\\pdf);
            ImageOutputStream ios = ImageIO.createImageOutputStream(file);
            ImageWriter writer = ImageIO.getImageWritersByFormatName("tiff").next();
            writer.setOutput(ios);
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            ImageType imageType = ImageType.RGB;//This can we Gray,ARGB,Binary
            int pageCount = document.getNumberOfPages();
    
            BufferedImage[] images = new BufferedImage[pageCount];
            writer.setOutput(ios);
            ImageWriteParam params = writer.getDefaultWriteParam();
            params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    
            // Compression: None, PackBits, ZLib, Deflate, LZW, JPEG and CCITT
            // variants allowed
            params.setCompressionType(LZW);
            writer.prepareWriteSequence(null);
            // System.out.println(document.getNumberOfPages());
    
            for (int page = 0; page < document.getNumberOfPages(); page++) {
                BufferedImage image = pdfRenderer.renderImageWithDPI(page,
                        Integer.parseInt("300", imageType);
                images[page] = image;
                IIOMetadata metadata = writer.getDefaultImageMetadata(new ImageTypeSpecifier(image), params);
                writer.writeToSequence(new IIOImage(image, null, metadata), params);
    
            }
            // clean up resources
            ios.flush();
            ios.close();
            writer.dispose();
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(contentPane, ex.getMessage()+"\n"+ ex.getCause());
        }
    }