Example #1
0
        public static void ReplaceStream(PRStream orig, PdfStream stream)
        {
            orig.Clear();
            MemoryStream ms = new MemoryStream();

            stream.WriteContent(ms);
            orig.SetData(ms.ToArray(), false);

            Console.WriteLine("Iterating keys");

            foreach (System.Collections.Generic.KeyValuePair <PdfName, PdfObject> keyValuePair in stream)
            {
                orig.Put(keyValuePair.Key, stream.Get(keyValuePair.Key));
            }
        }
Example #2
0
        /// <summary>
        /// Gets image from PDF and compresses it - Found on StackOverflow - asis
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="quality"></param>
        public static void ReduceResolution(PdfReader reader, long quality)
        {
            int n = reader.XrefSize;

            for (int i = 0; i < n; i++)
            {
                PdfObject obj = reader.GetPdfObject(i);
                if (obj == null || !obj.IsStream())
                {
                    continue;
                }

                PdfDictionary dict    = (PdfDictionary)PdfReader.GetPdfObject(obj);
                PdfName       subType = (PdfName)PdfReader.GetPdfObject(
                    dict.Get(PdfName.SUBTYPE)
                    );
                if (!PdfName.IMAGE.Equals(subType))
                {
                    continue;
                }

                PRStream stream = (PRStream)obj;
                try
                {
                    PdfImageObject image = new PdfImageObject(stream);
                    //PdfName filter = (PdfName)image.Get(PdfName.FILTER);
                    //if (
                    //  PdfName.JBIG2DECODE.Equals(filter)
                    //  || PdfName.JPXDECODE.Equals(filter)
                    //  || PdfName.CCITTFAXDECODE.Equals(filter)
                    //  || PdfName.FLATEDECODE.Equals(filter)
                    //) continue;

                    System.Drawing.Image img = image.GetDrawingImage();
                    if (img == null)
                    {
                        continue;
                    }

                    var ll     = image.GetImageBytesType();
                    int width  = img.Width;
                    int height = img.Height;
                    using (System.Drawing.Bitmap dotnetImg =
                               new System.Drawing.Bitmap(img))
                    {
                        // set codec to jpeg type => jpeg index codec is "1"
                        System.Drawing.Imaging.ImageCodecInfo codec =
                            System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()[1];
                        // set parameters for image quality
                        System.Drawing.Imaging.EncoderParameters eParams =
                            new System.Drawing.Imaging.EncoderParameters(1);
                        eParams.Param[0] =
                            new System.Drawing.Imaging.EncoderParameter(
                                System.Drawing.Imaging.Encoder.Quality, quality
                                );
                        using (MemoryStream msImg = new MemoryStream())
                        {
                            dotnetImg.Save(msImg, codec, eParams);
                            msImg.Position = 0;
                            stream.SetData(msImg.ToArray());
                            stream.SetData(
                                msImg.ToArray(), false, PRStream.BEST_COMPRESSION
                                );
                            stream.Put(PdfName.TYPE, PdfName.XOBJECT);
                            stream.Put(PdfName.SUBTYPE, PdfName.IMAGE);
                            stream.Put(PdfName.FILTER, image.Get(PdfName.FILTER));
                            stream.Put(PdfName.FILTER, PdfName.DCTDECODE);
                            stream.Put(PdfName.WIDTH, new PdfNumber(width));
                            stream.Put(PdfName.HEIGHT, new PdfNumber(height));
                            stream.Put(PdfName.BITSPERCOMPONENT, new PdfNumber(8));
                            stream.Put(PdfName.COLORSPACE, PdfName.DEVICERGB);
                        }
                    }
                }
                catch
                {
                    // throw;
                    // iText[Sharp] can't handle all image types...
                }
                finally
                {
                    // may or may not help
                    reader.RemoveUnusedObjects();
                }
            }
        }
        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));
                }
            }
        }
Example #4
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));
            }
        }