将pdf文件转换为tiff

时间:2021-07-12 19:35:08

标签: java pdf tiff graphics2d javax.imageio

我正在尝试将彩色图像或非图像 PDF 文件转换为多页 tiff 文件。为此,我编写了一些代码,但此代码将 PDF 文件转换为黑白的 tiff 文件。我需要 tiff 文件应该是彩色的。那么我应该进行哪些更改才能获得彩色 tiff 文件。

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");
    }

1 个答案:

答案 0 :(得分:0)

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());
    }
}