org.apache.pdfbox.filter
public class: RunLengthDecodeFilter [javadoc |
source]
java.lang.Object
org.apache.pdfbox.filter.RunLengthDecodeFilter
All Implemented Interfaces:
Filter
This is a filter for the RunLength Decoder.
From the PDF Reference
The RunLengthDecode filter decodes data that has been encoded in a simple
byte-oriented format based on run length. The encoded data is a sequence of
runs, where each run consists of a length byte followed by 1 to 128 bytes of data. If
the length byte is in the range 0 to 127, the following length + 1 (1 to 128) bytes
are copied literally during decompression. If length is in the range 129 to 255, the
following single byte is to be copied 257 ? length (2 to 128) times during decompression.
A length value of 128 denotes EOD.
The compression achieved by run-length encoding depends on the input data. In
the best case (all zeros), a compression of approximately 64:1 is achieved for long
files. The worst case (the hexadecimal sequence 00 alternating with FF) results in
an expansion of 127:128.
Method from org.apache.pdfbox.filter.RunLengthDecodeFilter Summary: |
---|
decode, encode |
Methods from java.lang.Object: |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Method from org.apache.pdfbox.filter.RunLengthDecodeFilter Detail: |
public void decode(InputStream compressedData,
OutputStream result,
COSDictionary options,
int filterIndex) throws IOException {
int dupAmount = -1;
byte[] buffer = new byte[128];
while( (dupAmount = compressedData.read()) != -1 && dupAmount != RUN_LENGTH_EOD )
{
if( dupAmount < = 127 )
{
int amountToCopy = dupAmount+1;
int compressedRead = 0;
while( amountToCopy > 0 )
{
compressedRead = compressedData.read( buffer, 0, amountToCopy );
result.write( buffer, 0, compressedRead );
amountToCopy -= compressedRead;
}
}
else
{
int dupByte = compressedData.read();
for( int i=0; i< 257-dupAmount; i++ )
{
result.write( dupByte );
}
}
}
}
|
public void encode(InputStream rawData,
OutputStream result,
COSDictionary options,
int filterIndex) throws IOException {
System.err.println( "Warning: RunLengthDecodeFilter.encode is not implemented yet, skipping this stream." );
}
|