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)); } }
/// <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)); } } }
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)); } }