Am 29.03.2016 um 09:14 schrieb Costas Stergiou:
>I wrote "upload", because attachments don't pass.
Got it, here is a public link:
https://onedrive.live.com/redir?resid=C5DCD865E294FE55!2348&authkey=!ABpDMjo
pfUpNRR8&ithint=file%2czip


Thanks; your code works fine. I was able to produce a PDF:
http://www.filedropper.com/huhu

I suspect that the problem is either with your calling code, or with your JAI version. I was able to extract the image from your file, and it looked weird.

Here's the complete code I used:


import com.sun.media.imageio.plugins.jpeg2000.J2KImageWriteParam;
import java.awt.color.ColorSpace;
import java.awt.color.ICC_ColorSpace;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageOutputStream;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.io.IOUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceCMYK;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

/**
 *
 * @author Costas Stergiou
 */
public class Jpeg2000Factory
{
    public static void main(String[] args) throws IOException
    {
BufferedImage awtColorImage = ImageIO.read(new File("XXXXXX/testimagefk9.jpg"));

        PDDocument doc = new PDDocument();
        PDPage page = new PDPage();
        doc.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(doc, page);

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        encodeImageToJPEGStream(awtColorImage, 1, baos);

PDImageXObject pdImage = new PDImageXObject(doc, new ByteArrayInputStream(baos.toByteArray()),
                COSName.JPX_DECODE, awtColorImage.getWidth(),
                awtColorImage.getHeight(),
                awtColorImage.getColorModel().getComponentSize(0),
                getColorSpaceFromAWT(awtColorImage));

        contentStream.drawImage(pdImage, 100, 600);

        contentStream.close();
        doc.save("XXXXX/huhu.pdf");
        doc.close();
    }

    // returns a PDColorSpace for a given BufferedImage
private static PDColorSpace getColorSpaceFromAWT(BufferedImage awtImage)
    {
        if (awtImage.getColorModel().getNumComponents() == 1)
        {
            // 256 color (gray) JPEG
            return PDDeviceGray.INSTANCE;
        }

ColorSpace awtColorSpace = awtImage.getColorModel().getColorSpace(); if (awtColorSpace instanceof ICC_ColorSpace && !awtColorSpace.isCS_sRGB())
        {
throw new UnsupportedOperationException("ICC color spaces not implemented");
        }

        switch (awtColorSpace.getType())
        {
            case ColorSpace.TYPE_RGB:
                return PDDeviceRGB.INSTANCE;
            case ColorSpace.TYPE_GRAY:
                return PDDeviceGray.INSTANCE;
            case ColorSpace.TYPE_CMYK:
                return PDDeviceCMYK.INSTANCE;
            default:
throw new UnsupportedOperationException("color space not implemented: "
                        + awtColorSpace.getType());
        }
    }

private static void encodeImageToJPEGStream(BufferedImage image, float quality, OutputStream out) throws IOException
    {
        // encode to JPEG
        ImageOutputStream ios = null;
        ImageWriter imageWriter = null;
        try
        {
            // find JAI writer
            imageWriter = ImageIO.getImageWritersBySuffix("jp2").next();
            ios = ImageIO.createImageOutputStream(out);
            imageWriter.setOutput(ios);
            // add compression
J2KImageWriteParam param = (J2KImageWriteParam) imageWriter.getDefaultWriteParam();
            param.setSOP(true);
            param.setEPH(true);
            param.setWriteCodeStreamOnly(true);
            if (quality == 1.0f)
            {
                param.setLossless(true);
                //param.setFilter(J2KImageWriteParam.FILTER_53);
            }
            else
            {
                param.setProgressionType("res");
param.setCompressionMode(J2KImageWriteParam.MODE_EXPLICIT);
                param.setCompressionType("JPEG2000");
                param.setLossless(false);
                param.setCompressionQuality(quality);
                param.setEncodingRate(1.01);
                param.setFilter(J2KImageWriteParam.FILTER_97);
            }
ImageTypeSpecifier imageTypeSpecifier = new ImageTypeSpecifier(image);
            IIOMetadata data
= imageWriter.getDefaultImageMetadata(imageTypeSpecifier, param);
            // write
imageWriter.write(data, new IIOImage(image, null, null), param);
        }
        finally
        {
            // clean up
            IOUtils.closeQuietly(out);
            if (ios != null)
            {
                ios.close();
            }
            if (imageWriter != null)
            {
                imageWriter.dispose();
            }
        }
    }
}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to