Ejemplo n.º 1
0
            public byte[] Decode(byte[] b, PdfName filterName, PdfObject decodeParams, PdfDictionary streamDictionary)
            {
                PdfNumber wn = (PdfNumber)PdfReader.GetPdfObjectRelease(streamDictionary.Get(PdfName.WIDTH));
                PdfNumber hn = (PdfNumber)PdfReader.GetPdfObjectRelease(streamDictionary.Get(PdfName.HEIGHT));

                if (wn == null || hn == null)
                {
                    throw new UnsupportedPdfException(MessageLocalization.GetComposedMessage("filter.ccittfaxdecode.is.only.supported.for.images"));
                }
                int width  = wn.IntValue;
                int height = hn.IntValue;

                PdfDictionary param     = decodeParams is PdfDictionary ? (PdfDictionary)decodeParams : null;
                int           k         = 0;
                bool          blackIs1  = false;
                bool          byteAlign = false;

                if (param != null)
                {
                    PdfNumber kn = param.GetAsNumber(PdfName.K);
                    if (kn != null)
                    {
                        k = kn.IntValue;
                    }
                    PdfBoolean bo = param.GetAsBoolean(PdfName.BLACKIS1);
                    if (bo != null)
                    {
                        blackIs1 = bo.BooleanValue;
                    }
                    bo = param.GetAsBoolean(PdfName.ENCODEDBYTEALIGN);
                    if (bo != null)
                    {
                        byteAlign = bo.BooleanValue;
                    }
                }
                byte[] outBuf = new byte[(width + 7) / 8 * height];
                TIFFFaxDecompressor decoder = new TIFFFaxDecompressor();

                if (k == 0 || k > 0)
                {
                    int tiffT4Options = k > 0 ? TIFFConstants.GROUP3OPT_2DENCODING : 0;
                    tiffT4Options |= byteAlign ? TIFFConstants.GROUP3OPT_FILLBITS : 0;
                    decoder.SetOptions(1, TIFFConstants.COMPRESSION_CCITTFAX3, tiffT4Options, 0);
                    decoder.DecodeRaw(outBuf, b, width, height);
                    if (decoder.fails > 0)
                    {
                        byte[] outBuf2  = new byte[(width + 7) / 8 * height];
                        int    oldFails = decoder.fails;
                        decoder.SetOptions(1, TIFFConstants.COMPRESSION_CCITTRLE, tiffT4Options, 0);
                        decoder.DecodeRaw(outBuf2, b, width, height);
                        if (decoder.fails < oldFails)
                        {
                            outBuf = outBuf2;
                        }
                    }
                }
                else
                {
                    TIFFFaxDecoder deca = new TIFFFaxDecoder(1, width, height);
                    deca.DecodeT6(outBuf, b, 0, height, 0);
                }
                if (!blackIs1)
                {
                    int len = outBuf.Length;
                    for (int t = 0; t < len; ++t)
                    {
                        outBuf[t] ^= 0xff;
                    }
                }
                b = outBuf;
                return(b);
            }
Ejemplo n.º 2
0
        public virtual byte[] Decode(byte[] b, PdfName filterName, PdfObject decodeParams, PdfDictionary streamDictionary
                                     )
        {
            PdfNumber wn = streamDictionary.GetAsNumber(PdfName.Width);
            PdfNumber hn = streamDictionary.GetAsNumber(PdfName.Height);

            if (wn == null || hn == null)
            {
                throw new PdfException(PdfException.FilterCcittfaxdecodeIsOnlySupportedForImages);
            }
            int           width     = wn.IntValue();
            int           height    = hn.IntValue();
            PdfDictionary param     = decodeParams is PdfDictionary ? (PdfDictionary)decodeParams : null;
            int           k         = 0;
            bool          blackIs1  = false;
            bool          byteAlign = false;

            if (param != null)
            {
                PdfNumber kn = param.GetAsNumber(PdfName.K);
                if (kn != null)
                {
                    k = kn.IntValue();
                }
                PdfBoolean bo = param.GetAsBoolean(PdfName.BlackIs1);
                if (bo != null)
                {
                    blackIs1 = bo.GetValue();
                }
                bo = param.GetAsBoolean(PdfName.EncodedByteAlign);
                if (bo != null)
                {
                    byteAlign = bo.GetValue();
                }
            }
            byte[] outBuf = new byte[(width + 7) / 8 * height];
            TIFFFaxDecompressor decoder = new TIFFFaxDecompressor();

            if (k == 0 || k > 0)
            {
                int tiffT4Options = k > 0 ? TIFFConstants.GROUP3OPT_2DENCODING : 0;
                tiffT4Options |= byteAlign ? TIFFConstants.GROUP3OPT_FILLBITS : 0;
                decoder.SetOptions(1, TIFFConstants.COMPRESSION_CCITTFAX3, tiffT4Options, 0);
                decoder.DecodeRaw(outBuf, b, width, height);
                if (decoder.fails > 0)
                {
                    byte[] outBuf2  = new byte[(width + 7) / 8 * height];
                    int    oldFails = decoder.fails;
                    decoder.SetOptions(1, TIFFConstants.COMPRESSION_CCITTRLE, tiffT4Options, 0);
                    decoder.DecodeRaw(outBuf2, b, width, height);
                    if (decoder.fails < oldFails)
                    {
                        outBuf = outBuf2;
                    }
                }
            }
            else
            {
                TIFFFaxDecoder deca = new TIFFFaxDecoder(1, width, height);
                deca.DecodeT6(outBuf, b, 0, height, 0);
            }
            if (!blackIs1)
            {
                int len = outBuf.Length;
                for (int t = 0; t < len; ++t)
                {
                    outBuf[t] ^= 0xff;
                }
            }
            b = outBuf;
            return(b);
        }