将PDF转换为JPG2000文件

时间:2018-11-02 08:55:34

标签: java pdfbox javax.imageio image-conversion

我最近开始从事这个项目,我需要将PDF文件转换为JPEG2000文件-每页1个jp2文件-。

目标是替换我们以前使用的pdf到jpeg转换器方法,以减小输出文件的大小。

基于我在互联网上找到的代码,我在下面做了pdftojpeg2000转换器方法,并且我一直在更改 setEncodingRate 参数值并比较结果。

我设法获得了较小的jpeg2000输出文件,但与Jpeg相比,质量非常差,特别是彩色文本或图像。

这是我原始的pdf文件的样子:

enter image description here

当我将 setEncodingRate 设置为0.8时,它看起来像这样:

enter image description here

我的输出文件大小为850Ko,甚至比Jpeg(大约600Ko)大,而且质量较低。

文件大小为0.1 setEncodingRate 时,文件大小相当小,为111 Ko,但基本上无法读取。

enter image description here

所以基本上,我想要到达的是质量更好的较小输出文件(<600K),而且我想知道Jpeg2000格式是否可行。

public class ImageConverter {

 public void compressor(String inputFile, String outputFile) throws IOException {
        J2KImageWriteParam iwp = new J2KImageWriteParam();
        PDDocument document = PDDocument.load(new File (inputFile), MemoryUsageSetting.setupMixed(10485760L));
        PDFRenderer pdfRenderer = new PDFRenderer(document);
        int nbPages = document.getNumberOfPages();
        int pageCounter = 0;
        BufferedImage image;
        for (PDPage page : document.getPages()) {
            if (page.hasContents()) {
                image = pdfRenderer.renderImageWithDPI(pageCounter, 300, ImageType.RGB);


                if (image == null) 
                {
                    System.out.println("If no registered ImageReader claims to be able to read the resulting stream");
                }

                Iterator writers = ImageIO.getImageWritersByFormatName("JPEG2000");
                String name = null;
                ImageWriter writer = null;
                while (name != "com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageWriter") {
                    writer = (ImageWriter) writers.next();
                    name = writer.getClass().getName();
                    System.out.println(name);
                }
                File f = new File(outputFile+"_"+pageCounter+".jp2");
                long s = System.currentTimeMillis();
                ImageOutputStream ios = ImageIO.createImageOutputStream(f);
                writer.setOutput(ios);
                J2KImageWriteParam param = (J2KImageWriteParam) writer.getDefaultWriteParam();
                IIOImage ioimage = new IIOImage(image, null, null);

                param.setSOP(true);
                param.setWriteCodeStreamOnly(true);
                param.setProgressionType("layer");
                param.setLossless(true);
                param.setCompressionMode(J2KImageWriteParam.MODE_EXPLICIT);
                param.setCompressionType("JPEG2000");
                param.setCompressionQuality(0.01f);
                param.setEncodingRate(1.01);
                param.setFilter(J2KImageWriteParam.FILTER_53 );                                 
                writer.write(null, ioimage, param);
                System.out.println(System.currentTimeMillis() - s);
                writer.dispose();
                ios.flush();
                ios.close();
                image.flush();

                pageCounter++;
            }
        }

    }


    public static void main(String[] args) {            
        String input = "E:/IMGTEST/mail-DOC0002.pdf";
        String output = "E:/IMGTEST/mail-DOC0002/docamail-DOC0002-";
        ImageConverter imgcv = new ImageConverter();
        try {
            imgcv.compressor(input, output);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

0 个答案:

没有答案