我正在尝试减少Java中几个PDF的文件大小。我找到了一些技巧来做到这一点。但调整图像大小似乎最有效。 我跟着使用iText的this piece of code。
它在一些PDF上很好用(从4.5MB减少到800KB!)但有些不受影响。
我按如下方式更改了代码,因此它会接受更多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();
)
一些研究发现,它试图打开的Stream是 CMYK JPG。
我想知道为什么这些不会打开,以及我如何调整这些图像的大小。 感谢
答案 0 :(得分:1)
BufferedImage本身并不处理CMYK(我不确定Java是否在其他本机组件中执行)。
在Java 6 docs中列出的字段中,没有cmyk颜色模型....
你可以看看this site,有人告诉你如何处理BufferedImage和CMYK色彩空间。
祝你好运!