ReadOnlyFilteredCOSStream extends COSStream { public static ReadOnlyFilteredCOSStream readOnlyJpegImage(File imageFile, int width, int height, int bitsPerComponent, PDColorSpace colorSpace) { requireNotNullArg(imageFile, "input file cannot be null"); requireNotNullArg(colorSpace, "color space cannot be null"); COSDictionary dictionary = new COSDictionary(); dictionary.setItem(COSName.TYPE, COSName.XOBJECT); dictionary.setItem(COSName.SUBTYPE, COSName.IMAGE); dictionary.setItem(COSName.FILTER, COSName.DCT_DECODE); dictionary.setInt(COSName.BITS_PER_COMPONENT, bitsPerComponent); dictionary.setInt(COSName.HEIGHT, height); dictionary.setInt(COSName.WIDTH, width); of(colorSpace).map(PDColorSpace::getCOSObject).ifPresent(cs -> dictionary.setItem(COSName.COLORSPACE, cs)); return new ReadOnlyFilteredCOSStream(dictionary, () -> new FileInputStream(imageFile), imageFile.length()); } ReadOnlyFilteredCOSStream(COSDictionary existingDictionary, InputStream stream, long length);  ReadOnlyFilteredCOSStream(COSDictionary existingDictionary, InputStreamSupplier<InputStream> stream,
            long length); @Override long getFilteredLength(); @Override long getUnfilteredLength(); @Override InputStream getUnfilteredStream(); @Override SeekableSource getUnfilteredSource(); @Override OutputStream createFilteredStream(); @Override OutputStream createFilteredStream(COSBase filters); @Override void setFilters(COSBase filters); @Override boolean addCompression(); @Override boolean encryptable(); @Override void encryptable(boolean encryptable); @Override OutputStream createUnfilteredStream(); @Override boolean isEmpty(); @Override boolean indirectLength(); @Override void indirectLength(boolean indirectLength); @Override IndirectCOSObjectIdentifier id(); @Override void idIfAbsent(IndirectCOSObjectIdentifier id); @Override void close(); static ReadOnlyFilteredCOSStream readOnly(COSStream existing); static ReadOnlyFilteredCOSStream readOnlyJpegImage(File imageFile, int width, int height,
            int bitsPerComponent, PDColorSpace colorSpace); static final ReadOnlyFilteredCOSStream readOnlyEmbeddedFile(Source<?> source);  }
@Test(expected = IllegalArgumentException.class) public void readOnlyJpegImageNullFile() { ReadOnlyFilteredCOSStream.readOnlyJpegImage(null, 10, 10, 1, mock(PDColorSpace.class)); }
@Test(expected = IllegalArgumentException.class) public void readOnlyJpegImageNullColorSpace() throws IOException { ReadOnlyFilteredCOSStream.readOnlyJpegImage(folder.newFile(), 10, 10, 1, null); }
@Test public void readOnlyJpegImage() throws FileNotFoundException, IOException { PDColorSpace colorSpace = mock(PDColorSpace.class); when(colorSpace.getCOSObject()).thenReturn(COSInteger.TWO); victim = ReadOnlyFilteredCOSStream.readOnlyJpegImage(folder.newFile(), 10, 20, 8, colorSpace); assertEquals(COSName.XOBJECT, victim.getItem(COSName.TYPE)); assertEquals(COSName.IMAGE, victim.getItem(COSName.SUBTYPE)); assertEquals(COSName.DCT_DECODE, victim.getItem(COSName.FILTER)); assertEquals(8, victim.getInt(COSName.BITS_PER_COMPONENT)); assertEquals(20, victim.getInt(COSName.HEIGHT)); assertEquals(10, victim.getInt(COSName.WIDTH)); assertEquals(COSInteger.TWO, victim.getItem(COSName.COLORSPACE)); }