@Override public int getFieldFlags() { int retval = 0; COSInteger ff = (COSInteger) getCOSObject().getDictionaryObject(COSName.FF); if (ff != null) { retval = ff.intValue(); } // There is no need to look up the parent hierarchy within a non terminal field return retval; }
/** * Decode JBIG2 data using Java ImageIO library. * * <p>{@inheritDoc} */ public void decode( InputStream compressedData, OutputStream result, COSDictionary options, int filterIndex) throws IOException { /** * A working JBIG2 ImageIO plugin is needed to decode JBIG2 encoded streams. The following is * known to be working. It can't be bundled with PDFBox because of an incompatible license. * http://code.google.com/p/jbig2-imageio/ */ Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("JBIG2"); if (!readers.hasNext()) { LOG.error("Can't find an ImageIO plugin to decode the JBIG2 encoded datastream."); return; } ImageReader reader = readers.next(); COSDictionary decodeP = (COSDictionary) options.getDictionaryObject(COSName.DECODE_PARMS); COSInteger bits = (COSInteger) options.getDictionaryObject(COSName.BITS_PER_COMPONENT); COSStream st = null; if (decodeP != null) { st = (COSStream) decodeP.getDictionaryObject(COSName.JBIG2_GLOBALS); } if (st != null) { reader.setInput( ImageIO.createImageInputStream( new SequenceInputStream(st.getFilteredStream(), compressedData))); } else { reader.setInput(ImageIO.createImageInputStream(compressedData)); } BufferedImage bi = reader.read(0); reader.dispose(); if (bi != null) { // I am assuming since JBIG2 is always black and white // depending on your renderer this might or might be needed if (bi.getColorModel().getPixelSize() != bits.intValue()) { if (bits.intValue() != 1) { LOG.error("Do not know how to deal with JBIG2 with more than 1 bit"); return; } BufferedImage packedImage = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_BYTE_BINARY); Graphics graphics = packedImage.getGraphics(); graphics.drawImage(bi, 0, 0, null); graphics.dispose(); bi = packedImage; } DataBuffer dBuf = bi.getData().getDataBuffer(); if (dBuf.getDataType() == DataBuffer.TYPE_BYTE) { result.write(((DataBufferByte) dBuf).getData()); } else { LOG.error("Image data buffer not of type byte but type " + dBuf.getDataType()); } } else { LOG.error("Something went wrong when decoding the JBIG2 encoded datastream."); } }
public COSBase getCOSObject() { COSDictionary dict = new COSDictionary(); COSArray arr = new COSArray(); for (Entry<Integer, PDPageLabelRange> i : labels.entrySet()) { arr.add(COSInteger.get(i.getKey())); arr.add(i.getValue()); } dict.setItem(COSName.NUMS, arr); return dict; }