package com.sun.pdfview.decode; import java.io.IOException; import java.nio.ByteBuffer; import org.jpedal.jbig2.JBIG2Decoder; import org.jpedal.jbig2.JBIG2Exception; import com.sun.pdfview.PDFObject; /***************************************************************************** * Decoder for jbig2 images within PDFs. * Copied from * https://pdf-renderer.dev.java.net/issues/show_bug.cgi?id=67 * * Problem is also described in: * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4799898 * @since 17.11.2010 *************************************************************************** */ public class JBig2Decode { protected static ByteBuffer decode(PDFObject dict, ByteBuffer buf, PDFObject params) throws IOException { byte[] bytes = new byte[buf.remaining()]; buf.get(bytes, 0, bytes.length); return ByteBuffer.wrap(decode(dict, bytes)); } protected static byte[] decode(PDFObject dict, byte[] source) throws IOException { JBIG2Decoder decoder; decoder = new JBIG2Decoder(); try { byte[] globals = getOptionFieldBytes(dict, "JBIG2Globals"); if (globals != null) { decoder.setGlobalData(globals); } decoder.decodeJBIG2(source); } catch (JBIG2Exception ex) { IOException ioException; ioException = new IOException(); ioException.initCause(ex); throw ioException; } return decoder.getPageAsJBIG2Bitmap(0).getData(true); } public static byte[] getOptionFieldBytes(PDFObject dict, String name) throws IOException { PDFObject dictParams = dict.getDictRef("DecodeParms"); if (dictParams == null) { return null; } PDFObject value = dictParams.getDictRef(name); if (value == null) { return null; } return value.getStream(); } }