Пример #1
0
        protected override void CheckStream(PdfWriter writer, int key, Object obj1)
        {
            if (obj1 is PdfStream)
            {
                PdfStream stream = (PdfStream)obj1;
                if (stream.Contains(PdfName.F) || stream.Contains(PdfName.FFILTER) || stream.Contains(PdfName.FDECODEPARMS))
                {
                    throw new PdfAConformanceException(obj1, MessageLocalization.GetComposedMessage("stream.object.dictionary.shall.not.contain.the.f.ffilter.or.fdecodeparams.keys"));
                }

                PdfObject filter = GetDirectObject(stream.Get(PdfName.FILTER));
                if (filter is PdfName)
                {
                    if (filter.Equals(PdfName.LZWDECODE))
                    {
                        throw new PdfAConformanceException(obj1, MessageLocalization.GetComposedMessage("lzwdecode.filter.is.not.permitted"));
                    }
                }
                else if (filter is PdfArray)
                {
                    foreach (PdfObject f in ((PdfArray)filter))
                    {
                        if (f.Equals(PdfName.LZWDECODE))
                        {
                            throw new PdfAConformanceException(obj1, MessageLocalization.GetComposedMessage("lzwdecode.filter.is.not.permitted"));
                        }
                    }
                }

                if (PdfName.FORM.Equals(stream.GetAsName(PdfName.SUBTYPE)))
                {
                    if (stream.Contains(PdfName.OPI))
                    {
                        throw new PdfAConformanceException(obj1, MessageLocalization.GetComposedMessage("a.form.xobject.dictionary.shall.not.contain.opi.key"));
                    }
                    if (stream.Contains(PdfName.PS))
                    {
                        throw new PdfAConformanceException(obj1, MessageLocalization.GetComposedMessage("a.form.xobject.dictionary.shall.not.contain.ps.key"));
                    }
                    PdfDictionary group = GetDirectDictionary(stream.Get(PdfName.GROUP));
                    if (group != null)
                    {
                        PdfName s = group.GetAsName(PdfName.S);
                        if (PdfName.TRANSPARENCY.Equals(s))
                        {
                            throw new PdfAConformanceException(obj1, MessageLocalization.GetComposedMessage("a.group.object.with.an.s.key.with.a.value.of.transparency.shall.not.be.included.in.a.form.xobject"));
                        }
                    }
                }
                if (PdfName.PS.Equals(stream.GetAsName(PdfName.SUBTYPE)))
                {
                    throw new PdfAConformanceException(obj1, MessageLocalization.GetComposedMessage("postscript.xobjects.are.not.allowed"));
                }
            }
        }
        private void Do_Image(PdfStream stream)
        {
            byte[] imageBuffer = null;

            PdfName filter = PdfName.NONE;

            if (stream.Contains(PdfName.FILTER))
            {
                filter = stream.GetAsName(PdfName.FILTER);
            }

            int imageWidth  = stream.GetAsNumber(PdfName.WIDTH).IntValue;
            int imageHeight = stream.GetAsNumber(PdfName.HEIGHT).IntValue;
            int imageBpp    = stream.GetAsNumber(PdfName.BITSPERCOMPONENT).IntValue;

            PRStream prStream = stream as PRStream;

            bool cannotReadImage = false;

            Bitmap image = null;

            try
            {
                PdfImageObject pdfImage = new PdfImageObject(prStream);
                image = pdfImage.GetDrawingImage() as Bitmap;


                string strFile = "C:\\PDF_Print\\pdf" + bmpfileidx.ToString() + ".bmp";
                image.Save(strFile);
                bmpfileidx++;
            }
            catch
            {
                try
                {
                    if (filter == PdfName.FLATEDECODE)
                    {
                        byte[] streamBuffer = PdfReader.GetStreamBytes(prStream);
                        image = this.CreateBitmapFromFlateDecodeImage(streamBuffer, imageWidth, imageHeight, imageBpp);

                        string strFile = "C:\\PDF_Print\\pdf_" + bmpfileidx.ToString() + ".bmp";
                        image.Save(strFile);
                        bmpfileidx++;
                    }
                }
                catch
                {
                    cannotReadImage = true;
                }
            }

            if (!cannotReadImage)
            {
                image = this.ConvertToGrayscale(image);
                //image = this.ConvertToBlackWhite(image);

                using (var ms = new MemoryStream())
                {
                    System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;

                    ImageCodecInfo    jgpEncoder          = GetEncoder(ImageFormat.Jpeg);
                    EncoderParameters myEncoderParameters = new EncoderParameters(1);
                    EncoderParameter  myEncoderParameter  = new EncoderParameter(myEncoder, 80L);
                    myEncoderParameters.Param[0] = myEncoderParameter;

                    image.Save(ms, jgpEncoder, myEncoderParameters);

                    imageBuffer = ms.ToArray();
                    //imageBuffer = ms.GetBuffer();

                    iTextSharp.text.Image newImage = iTextSharp.text.Image.GetInstance(imageBuffer);
                    newImage.SimplifyColorspace();

                    //                      PdfImage tempPdfImage = new PdfImage(newImage, newImage.ToString(), null);
                    //                      prStream.Clear();
                    //                      prStream.SetDataRaw(imageBuffer);
                    //                      prStream.Merge(tempPdfImage);

                    //                     imageBuffer = newImage.OriginalData;
                    //
                    prStream.Clear();
                    prStream.SetData(imageBuffer, false, PRStream.NO_COMPRESSION);
                    prStream.Put(PdfName.TYPE, PdfName.XOBJECT);
                    prStream.Put(PdfName.SUBTYPE, PdfName.IMAGE);
                    prStream.Put(PdfName.FILTER, PdfName.DCTDECODE);
                    prStream.Put(PdfName.WIDTH, new PdfNumber(image.Width));
                    prStream.Put(PdfName.HEIGHT, new PdfNumber(image.Height));
                    prStream.Put(PdfName.BITSPERCOMPONENT, new PdfNumber(8));
                    prStream.Put(PdfName.COLORSPACE, PdfName.DEVICERGB);
                    prStream.Put(PdfName.LENGTH, new PdfNumber(imageBuffer.LongLength));
                }
            }
        }
Пример #3
0
        private void Do_Image(PdfStream stream)
        {
            byte[] imageBuffer = null;

            PdfName filter = PdfName.NONE;

            if (stream.Contains(PdfName.FILTER))
            {
                filter = stream.GetAsName(PdfName.FILTER);
            }

            int imageWidth  = stream.GetAsNumber(PdfName.WIDTH).IntValue;
            int imageHeight = stream.GetAsNumber(PdfName.HEIGHT).IntValue;
            int imageBpp    = stream.GetAsNumber(PdfName.BITSPERCOMPONENT).IntValue;

            PRStream prStream = stream as PRStream;

            bool cannotReadImage = false;

            Bitmap image = null;

            try
            {
                PdfImageObject pdfImage = new PdfImageObject(prStream);
                image = pdfImage.GetDrawingImage() as Bitmap;
            }
            catch
            {
                try
                {
                    if (filter == PdfName.FLATEDECODE)
                    {
                        byte[] streamBuffer = PdfReader.GetStreamBytes(prStream);
                        image = this.CreateBitmapFromFlateDecodeImage(streamBuffer, imageWidth, imageHeight, imageBpp);
                    }
                }
                catch
                {
                    cannotReadImage = true;
                }
            }

            if (!cannotReadImage)
            {
                image = this.ConvertToGrayscale(image);

                using (var ms = new MemoryStream())
                {
                    System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;

                    ImageCodecInfo    jgpEncoder          = GetEncoder(ImageFormat.Jpeg);
                    EncoderParameters myEncoderParameters = new EncoderParameters(1);

                    //EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 80L);
                    EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 15L);
                    myEncoderParameters.Param[0] = myEncoderParameter;

                    image.Save(ms, jgpEncoder, myEncoderParameters);

                    imageBuffer = ms.GetBuffer();
                }

                Image compressedImage = Image.GetInstance(imageBuffer);

                imageBuffer = compressedImage.OriginalData;

                prStream.Clear();

                //prStream.SetData(imageBuffer, false, PRStream.NO_COMPRESSION);
                prStream.SetData(imageBuffer, false, PRStream.BEST_COMPRESSION);
                prStream.Put(PdfName.TYPE, PdfName.XOBJECT);
                prStream.Put(PdfName.SUBTYPE, PdfName.IMAGE);
                prStream.Put(PdfName.FILTER, PdfName.DCTDECODE);
                prStream.Put(PdfName.WIDTH, new PdfNumber(image.Width));
                prStream.Put(PdfName.HEIGHT, new PdfNumber(image.Height));
                prStream.Put(PdfName.BITSPERCOMPONENT, new PdfNumber(8));
                prStream.Put(PdfName.COLORSPACE, PdfName.DEVICERGB);
                prStream.Put(PdfName.LENGTH, new PdfNumber(imageBuffer.LongLength));
            }
        }