Изменение размера изображений в PDF с помощью iText: несовместимое преобразование цветов - PullRequest
2 голосов
/ 26 июля 2011

Я пытаюсь уменьшить размер файлов нескольких PDF-файлов на Java. Я нашел несколько методов, чтобы сделать это. Но изменение размеров изображений кажется наиболее эффективным. Я следовал этой части кода , которая использует iText.

Отлично работает на нескольких PDF (сокращение с 4,5 МБ до 800 КБ!), Но некоторые остались без изменений.

Я немного изменил код следующим образом, чтобы он принимал больше объектов Stream (и, надеюсь, сжимал больше):

PdfReader reader = new PdfReader(original.getPath());
int size = reader.getXrefSize();
for(int i=0;i<size;i++){
    PdfObject object = reader.getPdfObject(i);
    if (object == null || !object.isStream())
        continue;
    PRStream stream = (PRStream)object;
        PdfImageObject image = new PdfImageObject(stream);
        try{
        BufferedImage bi = image.getBufferedImage();
        //more stuff here

И это сделал! Некоторые PDF-файлы фактически сжаты намного больше. Однако у некоторых я получил странное исключение, которое не изменилось совсем:

javax.imageio.IIOException: Incompatible color conversion
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkColorConversion(JPEGImageReader.java:927)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1028)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:984)
    at javax.imageio.ImageIO.read(ImageIO.java:1438)
    at javax.imageio.ImageIO.read(ImageIO.java:1342)
    at com.itextpdf.text.pdf.parser.PdfImageObject.getBufferedImage(PdfImageObject.java:302)
    at com.example.compression.App.main(App.java:56)

(App.java:56 - строка, которая говорит image.getBufferedImage();)

Некоторые исследования обнаружили, что поток, который он пытался открыть, был CMYK JPG.

Мне интересно, почему они не открываются, и как я могу изменить размеры этих изображений в любом случае. Спасибо

1 Ответ

1 голос
/ 26 июля 2011

BufferedImage нативно не работает с CMYK (и я не уверен, что в любом случае Java работает с другими нативными компонентами).

В полях, перечисленных в Документы по Java 6 ,цветовой модели cmyk нет ....

Вы можете взглянуть на этот сайт , кто-то подскажет, как обращаться с цветовым пространством BufferedImage и CMYK.

Удачи!

...