Конвертировать PDF в JPG2000 файл (ы) - PullRequest
0 голосов
/ 02 ноября 2018

Я недавно начал работать над этим проектом, где мне нужно преобразовать файл 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

Итак, в основном я пытаюсь получить меньшие выходные файлы (<600 КБ) с лучшим качеством, и мне интересно, возможно ли это с форматом Jpeg2000. </p>

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

    }

}

...