Inheritance: PdfStream
Beispiel #1
0
        /**
         * Copies the output intent dictionary from other document to this one.
         * @param reader the other document
         * @param checkExistence <CODE>true</CODE> to just check for the existence of a valid output intent
         * dictionary, <CODE>false</CODE> to insert the dictionary if it exists
         * @throws IOException on error
         * @return <CODE>true</CODE> if the output intent dictionary exists, <CODE>false</CODE>
         * otherwise
         */
        public override bool SetOutputIntents(PdfReader reader, bool checkExistence)
        {
            PdfDictionary catalog = reader.Catalog;
            PdfArray      outs    = catalog.GetAsArray(PdfName.OUTPUTINTENTS);

            if (outs == null)
            {
                return(false);
            }
            if (outs.Size == 0)
            {
                return(false);
            }
            PdfDictionary outa = outs.GetAsDict(0);
            PdfObject     obj  = PdfReader.GetPdfObject(outa.Get(PdfName.S));

            if (obj == null || !PdfName.GTS_PDFA1.Equals(obj))
            {
                return(false);
            }
            if (checkExistence)
            {
                return(true);
            }
            PRStream stream = (PRStream)PdfReader.GetPdfObject(outa.Get(PdfName.DESTOUTPUTPROFILE));

            byte[] destProfile = null;
            if (stream != null)
            {
                destProfile = PdfReader.GetStreamBytes(stream);
            }
            SetOutputIntents(GetNameString(outa, PdfName.OUTPUTCONDITIONIDENTIFIER), GetNameString(outa, PdfName.OUTPUTCONDITION),
                             GetNameString(outa, PdfName.REGISTRYNAME), GetNameString(outa, PdfName.INFO), destProfile);
            return(true);
        }
            internal ByteStore(PRStream str)
            {
                ByteBuffer bb    = new ByteBuffer();
                int        level = 100;

                SerObject(str, level, bb);
                this.b = bb.ToByteArray();
            }
Beispiel #3
0
            internal ByteStore(PRStream str, Dictionary <RefKey, int> serialized)
            {
                ByteBuffer bb    = new ByteBuffer();
                int        level = 100;

                SerObject(str, level, bb, serialized);
                this.b = bb.ToByteArray();
                hash   = CalculateHash(this.b);
            }
Beispiel #4
0
            internal ByteStore(PRStream str)
            {
                md5 = new MD5CryptoServiceProvider();
                ByteBuffer bb    = new ByteBuffer();
                int        level = 100;

                SerObject(str, level, bb);
                this.b = bb.ToByteArray();
                md5    = null;
            }
            internal ByteStore(PRStream str)
            {
                md5 = HashAlgorithm.Create("MD5");
                ByteBuffer bb    = new ByteBuffer();
                int        level = 100;

                SerObject(str, level, bb);
                this.b = bb.ToByteArray();
                md5    = null;
            }
Beispiel #6
0
        /**
         * Translate a PRStream to a PdfStream. The data part copies itself.
         */
        protected PdfStream CopyStream(PRStream inp)
        {
            PRStream outp = new PRStream(inp, null);

            foreach (PdfName key in inp.Keys)
            {
                PdfObject value = inp.Get(key);
                outp.Put(key, CopyObject(value));
            }

            return(outp);
        }
Beispiel #7
0
        protected PdfObject readPRObject()
        {
            tokens.nextValidToken();
            int type = tokens.TokenType;

            switch (type)
            {
            case PRTokeniser.TK_START_DIC: {
                PdfDictionary dic = readDictionary();
                int           pos = tokens.FilePointer;
                tokens.nextValidToken();
                if (tokens.StringValue.Equals("stream"))
                {
                    int ch = tokens.read();
                    if (ch == '\r')
                    {
                        ch = tokens.read();
                    }
                    if (ch != '\n')
                    {
                        tokens.backOnePosition();
                    }
                    PRStream stream = new PRStream(this, tokens.FilePointer);
                    stream.putAll(dic);
                    return(stream);
                }
                else
                {
                    tokens.seek(pos);
                    return(dic);
                }
            }

            case PRTokeniser.TK_START_ARRAY:
                return(readArray());

            case PRTokeniser.TK_NUMBER:
                return(new PdfNumber(tokens.StringValue));

            case PRTokeniser.TK_STRING:
                return(new PdfString(tokens.StringValue, null));

            case PRTokeniser.TK_NAME:
                return(new PdfName(tokens.StringValue));

            case PRTokeniser.TK_REF:
                return(new PRIndirectReference(this, tokens.Reference, tokens.Generation));

            default:
                return(new PdfLiteral(-type, tokens.StringValue));
            }
        }
        /**
         * Gets the content stream of a page as a PdfStream object.
         * @param   pageNumber          the page of which you want the stream
         * @param   compressionLevel    the compression level you want to apply to the stream
         * @return  a PdfStream object
         * @since   2.1.3 (the method already existed without param compressionLevel)
         */
        internal PdfStream GetFormXObject(int pageNumber, int compressionLevel)
        {
            PdfDictionary page     = reader.GetPageNRelease(pageNumber);
            PdfObject     contents = PdfReader.GetPdfObjectRelease(page.Get(PdfName.CONTENTS));
            PdfDictionary dic      = new PdfDictionary();

            byte[] bout = null;
            if (contents != null)
            {
                if (contents.IsStream())
                {
                    dic.Merge((PRStream)contents);
                }
                else
                {
                    bout = reader.GetPageContent(pageNumber, file);
                }
            }
            else
            {
                bout = new byte[0];
            }
            dic.Put(PdfName.RESOURCES, PdfReader.GetPdfObjectRelease(page.Get(PdfName.RESOURCES)));
            dic.Put(PdfName.TYPE, PdfName.XOBJECT);
            dic.Put(PdfName.SUBTYPE, PdfName.FORM);
            PdfImportedPage impPage = importedPages[pageNumber];

            dic.Put(PdfName.BBOX, new PdfRectangle(impPage.BoundingBox));
            PdfArray matrix = impPage.Matrix;

            if (matrix == null)
            {
                dic.Put(PdfName.MATRIX, IDENTITYMATRIX);
            }
            else
            {
                dic.Put(PdfName.MATRIX, matrix);
            }
            dic.Put(PdfName.FORMTYPE, ONE);
            PRStream stream;

            if (bout == null)
            {
                stream = new PRStream((PRStream)contents, dic);
            }
            else
            {
                stream = new PRStream(reader, bout);
                stream.Merge(dic);
            }
            return(stream);
        }
Beispiel #9
0
 public PRStream(PRStream stream, PdfDictionary newDic) {
     reader = stream.reader;
     offset = stream.offset;
     length = stream.Length;
     compressed = stream.compressed;
     compressionLevel = stream.compressionLevel;
     streamBytes = stream.streamBytes;
     bytes = stream.bytes;
     objNum = stream.objNum;
     objGen = stream.objGen;
     if (newDic != null)
         Merge(newDic);
     else
         Merge(stream);
 }
Beispiel #10
0
        /**
         * Gets a byte[] containing a file that is embedded in the FDF.
         * @param name the fully qualified field name
         * @return the bytes of the file
         * @throws IOException
         * @since 5.0.1
         */
        public byte[] GetAttachedFile(String name)
        {
            PdfDictionary field = GetField(name);

            if (field != null)
            {
                PdfIndirectReference ir       = (PRIndirectReference)field.Get(PdfName.V);
                PdfDictionary        filespec = (PdfDictionary)GetPdfObject(ir.Number);
                PdfDictionary        ef       = filespec.GetAsDict(PdfName.EF);
                ir = (PRIndirectReference)ef.Get(PdfName.F);
                PRStream stream = (PRStream)GetPdfObject(ir.Number);
                return(GetStreamBytes(stream));
            }
            return(new byte[0]);
        }
Beispiel #11
0
        /**
         * Translate a PRStream to a PdfStream. The data part copies itself.
         */
        protected PdfStream CopyStream(PRStream inp)
        {
            PRStream outp = new PRStream(inp, null);

            foreach (PdfName key in inp.Keys)
            {
                PdfObject value = inp.Get(key);
                parentObjects.Add(value, inp);
                PdfObject res = CopyObject(value);
                if ((res != null) && !(res is PdfNull))
                {
                    outp.Put(key, res);
                }
            }

            return(outp);
        }
Beispiel #12
0
        protected void readDocObj()
        {
            ArrayList streams = new ArrayList();

            xrefObj = new PdfObject[xref.Length];
            for (int k = 1; k < xrefObj.Length; ++k)
            {
                int pos = xref[k];
                if (pos <= 0)
                {
                    continue;
                }
                tokens.seek(pos);
                tokens.nextValidToken();
                if (tokens.TokenType != PRTokeniser.TK_NUMBER)
                {
                    tokens.throwError("Invalid object number.");
                }
                int objNum = tokens.IntValue;
                tokens.nextValidToken();
                if (tokens.TokenType != PRTokeniser.TK_NUMBER)
                {
                    tokens.throwError("Invalid generation number.");
                }
                int objGen = tokens.IntValue;
                tokens.nextValidToken();
                if (!tokens.StringValue.Equals("obj"))
                {
                    tokens.throwError("Token 'obj' expected.");
                }
                PdfObject obj = readPRObject();
                xrefObj[k] = obj;
                if (obj.Type == PdfObject.STREAM)
                {
                    streams.Add(obj);
                }
            }
            for (int k = 0; k < streams.Count; ++k)
            {
                PRStream  stream = (PRStream)streams[k];
                PdfObject length = getPdfObject(stream.get(PdfName.LENGTH));
                stream.Length = ((PdfNumber)length).IntValue;
            }
        }
Beispiel #13
0
 public PRStream(PRStream stream, PdfDictionary newDic)
 {
     reader      = stream.reader;
     offset      = stream.offset;
     length      = stream.Length;
     compressed  = stream.compressed;
     streamBytes = stream.streamBytes;
     bytes       = stream.bytes;
     objNum      = stream.objNum;
     objGen      = stream.objGen;
     if (newDic != null)
     {
         Merge(newDic);
     }
     else
     {
         Merge(stream);
     }
 }
Beispiel #14
0
 /// <summary>
 /// Parses a stream object and removes OCGs. </summary>
 /// <param name="stream">	a stream object </param>
 /// <param name="resources">	the resources dictionary of that object (containing info about the OCGs) </param>
 public virtual void Parse(PRStream stream, PdfDictionary resources) {
     baos = new MemoryStream();
     properties = resources.GetAsDict(PdfName.PROPERTIES);
     xobj = new HashSet2<PdfName>();
     PdfDictionary xobjects = resources.GetAsDict(PdfName.XOBJECT);
     if (xobjects != null) {
         // remove XObject (form or image) that belong to an OCG that needs to be removed
         foreach (PdfName name in xobjects.Keys) {
             PRStream xobject = (PRStream) xobjects.GetAsStream(name);
             PdfDictionary oc = xobject.GetAsDict(PdfName.OC);
             if (oc != null) {
                 PdfString ocname = oc.GetAsString(PdfName.NAME);
                 if (ocname != null && ocgs.Contains(ocname.ToString())) {
                     xobj.Add(name);
                 }
             }
         }
         foreach (PdfName name in xobj) {
             xobjects.Remove(name);
         }
     }
     // parse the content stream
     byte[] contentBytes = PdfReader.GetStreamBytes(stream);
     PRTokeniser tokeniser = new PRTokeniser(new RandomAccessFileOrArray(contentBytes));
     PdfContentParser ps = new PdfContentParser(tokeniser);
     List<PdfObject> operands = new List<PdfObject>();
     while (ps.Parse(operands).Count > 0) {
         PdfLiteral @operator = (PdfLiteral) operands[operands.Count - 1];
         ProcessOperator(this, @operator, operands);
     }
     baos.Flush();
     baos.Close();
     stream.SetData(baos.GetBuffer());
 }
Beispiel #15
0
 /**
 * Gets the content stream of a page as a PdfStream object.
 * @param   pageNumber          the page of which you want the stream
 * @param   compressionLevel    the compression level you want to apply to the stream
 * @return  a PdfStream object
 * @since   2.1.3 (the method already existed without param compressionLevel)
 */
 internal PdfStream GetFormXObject(int pageNumber, int compressionLevel) {
     PdfDictionary page = reader.GetPageNRelease(pageNumber);
     PdfObject contents = PdfReader.GetPdfObjectRelease(page.Get(PdfName.CONTENTS));
     PdfDictionary dic = new PdfDictionary();
     byte[] bout = null;
     if (contents != null) {
         if (contents.IsStream())
             dic.Merge((PRStream)contents);
         else
             bout = reader.GetPageContent(pageNumber, file);
     }
     else
         bout = new byte[0];
     dic.Put(PdfName.RESOURCES, PdfReader.GetPdfObjectRelease(page.Get(PdfName.RESOURCES)));
     dic.Put(PdfName.TYPE, PdfName.XOBJECT);
     dic.Put(PdfName.SUBTYPE, PdfName.FORM);
     PdfImportedPage impPage = importedPages[pageNumber];
     dic.Put(PdfName.BBOX, new PdfRectangle(impPage.BoundingBox));
     PdfArray matrix = impPage.Matrix;
     if (matrix == null)
         dic.Put(PdfName.MATRIX, IDENTITYMATRIX);
     else
         dic.Put(PdfName.MATRIX, matrix);
     dic.Put(PdfName.FORMTYPE, ONE);
     PRStream stream;
     if (bout == null) {
         stream = new PRStream((PRStream)contents, dic);
     }
     else {
         stream = new PRStream(reader, bout);
         stream.Merge(dic);
     }
     return stream;
 }
 /**
  * Creates a PdfImage object.
  * @param stream a PRStream
  * @throws IOException
  */
 public PdfImageObject(PRStream stream)
     : this(stream, PdfReader.GetStreamBytesRaw(stream), null)
 {
 }
Beispiel #17
0
 protected internal static PdfObject DuplicatePdfObject(PdfObject original, PdfReader newReader) {
     if (original == null)
         return null;
     switch (original.Type) {
         case PdfObject.DICTIONARY: {
             return DuplicatePdfDictionary((PdfDictionary)original, null, newReader);
         }
         case PdfObject.STREAM: {
             PRStream org = (PRStream)original;
             PRStream stream = new PRStream(org, null, newReader);
             DuplicatePdfDictionary(org, stream, newReader);
             return stream;
         }
         case PdfObject.ARRAY: {
             PdfArray arr = new PdfArray();
             for (ListIterator<PdfObject> it = ((PdfArray)original).GetListIterator(); it.HasNext();) {
                 arr.Add(DuplicatePdfObject((PdfObject)it.Next(), newReader));
             }
             return arr;
         }
         case PdfObject.INDIRECT: {
             PRIndirectReference org = (PRIndirectReference)original;
             return new PRIndirectReference(newReader, org.Number, org.Generation);
         }
         default:
             return original;
     }
 }
Beispiel #18
0
 /** Get the content from a stream as it is without applying any filter.
 * @param stream the stream
 * @param file the location where the stream is
 * @throws IOException on error
 * @return the stream content
 */    
 public static byte[] GetStreamBytesRaw(PRStream stream, RandomAccessFileOrArray file) {
     PdfReader reader = stream.Reader;
     byte[] b;
     if (stream.Offset < 0)
         b = stream.GetBytes();
     else {
         b = new byte[stream.Length];
         file.Seek(stream.Offset);
         file.ReadFully(b);
         PdfEncryption decrypt = reader.Decrypt;
         if (decrypt != null) {
             PdfObject filter = GetPdfObjectRelease(stream.Get(PdfName.FILTER));
             List<PdfObject> filters = new List<PdfObject>();
             if (filter != null) {
                 if (filter.IsName())
                     filters.Add(filter);
                 else if (filter.IsArray())
                     filters = ((PdfArray)filter).ArrayList;
             }
             bool skip = false;
             for (int k = 0; k < filters.Count; ++k) {
                 PdfObject obj = GetPdfObjectRelease(filters[k]);
                 if (obj != null && obj.ToString().Equals("/Crypt")) {
                     skip = true;
                     break;
                 }
             }
             if (!skip) {
                 decrypt.SetHashKey(stream.ObjNum, stream.ObjGen);
                 b = decrypt.DecryptByteArray(b);
             }
         }
     }
     return b;
 }
Beispiel #19
0
 /** Get the content from a stream applying the required filters.
 * @param stream the stream
 * @param file the location where the stream is
 * @throws IOException on error
 * @return the stream content
 */    
 public static byte[] GetStreamBytes(PRStream stream, RandomAccessFileOrArray file) {
     PdfObject filter = GetPdfObjectRelease(stream.Get(PdfName.FILTER));
     byte[] b = GetStreamBytesRaw(stream, file);
     ArrayList filters = new ArrayList();
     if (filter != null) {
         if (filter.IsName())
             filters.Add(filter);
         else if (filter.IsArray())
             filters = ((PdfArray)filter).ArrayList;
     }
     ArrayList dp = new ArrayList();
     PdfObject dpo = GetPdfObjectRelease(stream.Get(PdfName.DECODEPARMS));
     if (dpo == null || (!dpo.IsDictionary() && !dpo.IsArray()))
         dpo = GetPdfObjectRelease(stream.Get(PdfName.DP));
     if (dpo != null) {
         if (dpo.IsDictionary())
             dp.Add(dpo);
         else if (dpo.IsArray())
             dp = ((PdfArray)dpo).ArrayList;
     }
     String name;
     for (int j = 0; j < filters.Count; ++j) {
         name = ((PdfName)GetPdfObjectRelease((PdfObject)filters[j])).ToString();
         if (name.Equals("/FlateDecode") || name.Equals("/Fl")) {
             b = FlateDecode(b);
             PdfObject dicParam = null;
             if (j < dp.Count) {
                 dicParam = (PdfObject)dp[j];
                 b = DecodePredictor(b, dicParam);
             }
         }
         else if (name.Equals("/ASCIIHexDecode") || name.Equals("/AHx"))
             b = ASCIIHexDecode(b);
         else if (name.Equals("/ASCII85Decode") || name.Equals("/A85"))
             b = ASCII85Decode(b);
         else if (name.Equals("/LZWDecode")) {
             b = LZWDecode(b);
             PdfObject dicParam = null;
             if (j < dp.Count) {
                 dicParam = (PdfObject)dp[j];
                 b = DecodePredictor(b, dicParam);
             }
         }
         else if (name.Equals("/Crypt")) {
         }
         else
             throw new UnsupportedPdfException(MessageLocalization.GetComposedMessage("the.filter.1.is.not.supported", name));
     }
     return b;
 }
        private void UpdateImageStream(PRStream imageStream, byte[] newData) {
            PdfImage image = new PdfImage(Image.GetInstance(newData), "", null);

            if (imageStream.Contains(PdfName.SMASK)) {
                image.Put(PdfName.SMASK, imageStream.Get(PdfName.SMASK));
            }

            if (imageStream.Contains(PdfName.MASK)) {
                image.Put(PdfName.MASK, imageStream.Get(PdfName.MASK));
            }

            if (imageStream.Contains(PdfName.SMASKINDATA)) {
                image.Put(PdfName.SMASKINDATA, imageStream.Get(PdfName.SMASKINDATA));
            }

            imageStream.Clear();
            imageStream.PutAll(image);
            imageStream.SetDataRaw(image.GetBytes());
        }
Beispiel #21
0
 internal ByteStore(PRStream str)
 {
     md5 = new MD5CryptoServiceProvider();
     ByteBuffer bb = new ByteBuffer();
     int level = 100;
     SerObject(str, level, bb);
     this.b = bb.ToByteArray();
     md5 = null;
 }
Beispiel #22
0
 /**
  * Creates a PdfImage object.
  * @param stream a PRStream
  * @throws IOException
  */
 public PdfImageObject(PRStream stream) : this(stream, iTextSharp.text.pdf.PdfReader.GetStreamBytesRaw(stream), null) {
 }
Beispiel #23
0
 /** Sets the contents of the page.
 * @param content the new page content
 * @param pageNum the page number. 1 is the first
 * @since   2.1.3   (the method already existed without param compressionLevel)
 */
 virtual public void SetPageContent(int pageNum, byte[] content, int compressionLevel) {
     PdfDictionary page = GetPageN(pageNum);
     if (page == null)
         return;
     PdfObject contents = page.Get(PdfName.CONTENTS);
     freeXref = -1;
     KillXref(contents);
     if (freeXref == -1) {
         xrefObj.Add(null);
         freeXref = xrefObj.Count - 1;
     }
     page.Put(PdfName.CONTENTS, new PRIndirectReference(this, freeXref));
     xrefObj[freeXref] = new PRStream(this, content, compressionLevel);
 }
Beispiel #24
0
 /** Get the content from a stream applying the required filters.
  * @param stream the stream
  * @param file the location where the stream is
  * @throws IOException on error
  * @return the stream content
  */
 public static byte[] GetStreamBytes(PRStream stream, RandomAccessFileOrArray file) {
     byte[] b = GetStreamBytesRaw(stream, file);
     return DecodeBytes(b, stream);
 }
Beispiel #25
0
 private void CheckPRStreamLength(PRStream stream) {
     int fileLength = tokens.Length;
     int start = stream.Offset;
     bool calc = false;
     int streamLength = 0;
     PdfObject obj = GetPdfObjectRelease(stream.Get(PdfName.LENGTH));
     if (obj != null && obj.Type == PdfObject.NUMBER) {
         streamLength = ((PdfNumber)obj).IntValue;
         if (streamLength + start > fileLength - 20)
             calc = true;
         else {
             tokens.Seek(start + streamLength);
             String line = tokens.ReadString(20);
             if (!line.StartsWith("\nendstream") &&
             !line.StartsWith("\r\nendstream") &&
             !line.StartsWith("\rendstream") &&
             !line.StartsWith("endstream"))
                 calc = true;
         }
     }
     else
         calc = true;
     if (calc) {
         byte[] tline = new byte[16];
         tokens.Seek(start);
         while (true) {
             int pos = tokens.FilePointer;
             if (!tokens.ReadLineSegment(tline))
                 break;
             if (Equalsn(tline, endstream)) {
                 streamLength = pos - start;
                 break;
             }
             if (Equalsn(tline, endobj)) {
                 tokens.Seek(pos - 16);
                 String s = tokens.ReadString(16);
                 int index = s.IndexOf("endstream");
                 if (index >= 0)
                     pos = pos - 16 + index;
                 streamLength = pos - start;
                 break;
             }
         }
     }
     stream.Length = streamLength;
 }
Beispiel #26
0
 /** Get the content from a stream as it is without applying any filter.
 * @param stream the stream
 * @throws IOException on error
 * @return the stream content
 */    
 public static byte[] GetStreamBytesRaw(PRStream stream) {
     RandomAccessFileOrArray rf = stream.Reader.SafeFile;
     try {
         rf.ReOpen();
         return GetStreamBytesRaw(stream, rf);
     }
     finally {
         try{rf.Close();}catch{}
     }
 }
Beispiel #27
0
 /**
 * Translate a PRStream to a PdfStream. The data part copies itself.
 */
 protected PdfStream CopyStream(PRStream inp) {
     PRStream outp = new PRStream(inp, null);
     
     foreach (PdfName key in inp.Keys) {
         PdfObject value = inp.Get(key);
         parentObjects[value] = inp;
         PdfObject res = CopyObject(value);
         if ((res != null) && !(res is PdfNull))
             outp.Put(key, res);
     }
     
     return outp;
 }
Beispiel #28
0
 internal ByteStore(PRStream str)
 {
     md5 = HashAlgorithm.Create("MD5");
     ByteBuffer bb = new ByteBuffer();
     int level = 100;
     SerObject(str, level, bb);
     this.b = bb.ToByteArray();
     md5 = null;
 }
Beispiel #29
0
 internal ByteStore(PRStream str)
 {
     ByteBuffer bb = new ByteBuffer();
     int level = 100;
     SerObject(str, level, bb);
     this.b = bb.ToByteArray();
 }
 /**
  * Creates a PdfImage object.
  * @param stream a PRStream
  * @param colorSpaceDic a color space dictionary
  * @throws IOException
  */
 public PdfImageObject(PRStream stream, PdfDictionary colorSpaceDic)
     : this(stream, PdfReader.GetStreamBytesRaw(stream), colorSpaceDic)
 {
 }
        internal PdfStream getFormXObject(int pageNumber)
        {
            PdfDictionary page     = pages[pageNumber - 1];
            PdfObject     contents = reader.getPdfObject(page.get(PdfName.CONTENTS));
            int           length   = 0;
            int           offset   = 0;
            PdfDictionary dic      = new PdfDictionary();
            MemoryStream  bout     = null;
            ArrayList     filters  = null;

            if (contents != null)
            {
                if (contents.Type == PdfObject.STREAM)
                {
                    PRStream stream = (PRStream)contents;
                    length = stream.Length;
                    offset = stream.Offset;
                    dic.putAll(stream);
                }
                else
                {
                    PdfArray  array = (PdfArray)contents;
                    ArrayList list  = array.ArrayList;
                    bout = new MemoryStream();
                    for (int k = 0; k < list.Count; ++k)
                    {
                        PRStream  stream = (PRStream)reader.getPdfObject((PdfObject)list[k]);
                        PdfObject filter = stream.get(PdfName.FILTER);
                        byte[]    b      = new byte[stream.Length];
                        file.seek(stream.Offset);
                        file.readFully(b);
                        filters = new ArrayList();
                        if (filter != null)
                        {
                            if (filter.Type == PdfObject.NAME)
                            {
                                filters.Add(filter);
                            }
                            else if (filter.Type == PdfObject.ARRAY)
                            {
                                filters = ((PdfArray)filter).ArrayList;
                            }
                        }
                        string name;
                        for (int j = 0; j < filters.Count; ++j)
                        {
                            name = ((PdfName)filters[j]).ToString();
                            if (name.Equals("/FlateDecode") || name.Equals("/Fl"))
                            {
                                b = PdfReader.FlateDecode(b);
                            }
                            else if (name.Equals("/ASCIIHexDecode") || name.Equals("/AHx"))
                            {
                                b = PdfReader.ASCIIHexDecode(b);
                            }
                            else if (name.Equals("/ASCII85Decode") || name.Equals("/A85"))
                            {
                                b = PdfReader.ASCII85Decode(b);
                            }
                            else if (name.Equals("/LZWDecode"))
                            {
                                b = PdfReader.LZWDecode(b);
                            }
                            else
                            {
                                throw new IOException("The filter " + name + " is not supported.");
                            }
                        }
                        bout.Write(b, 0, b.Length);
                        if (k != list.Count - 1)
                        {
                            bout.WriteByte((byte)'\n');
                        }
                    }
                }
            }
            dic.put(PdfName.RESOURCES, reader.getPdfObject(page.get(PdfName.RESOURCES)));
            dic.put(PdfName.TYPE, PdfName.XOBJECT);
            dic.put(PdfName.SUBTYPE, PdfName.FORM);
            dic.put(PdfName.BBOX, new PdfRectangle(((PdfImportedPage)importedPages[pageNumber]).BoundingBox));
            dic.put(PdfName.MATRIX, IDENTITYMATRIX);
            dic.put(PdfName.FORMTYPE, ONE);
            PRStream str;

            if (bout == null)
            {
                str = new PRStream(reader, offset);
                str.putAll(dic);
                str.Length = length;
            }
            else
            {
                str = new PRStream(reader, bout.ToArray());
                str.putAll(dic);
            }
            return(str);
        }
Beispiel #32
0
        /**
        * Translate a PRStream to a PdfStream. The data part copies itself.
        */
        protected PdfStream CopyStream(PRStream inp)
        {
            PRStream outp = new PRStream(inp, null);

            foreach (PdfName key in inp.Keys) {
                PdfObject value = inp.Get(key);
                outp.Put(key, CopyObject(value));
            }

            return outp;
        }
Beispiel #33
0
 virtual protected internal void ReadObjStm(PRStream stream, IntHashtable map) {
     if (stream == null) return;
     int first = stream.GetAsNumber(PdfName.FIRST).IntValue;
     int n = stream.GetAsNumber(PdfName.N).IntValue;
     byte[] b = GetStreamBytes(stream, tokens.File);
     PRTokeniser saveTokens = tokens;
     tokens = new PRTokeniser(new RandomAccessFileOrArray(new RandomAccessSourceFactory().CreateSource(b)));
     try {
         int[] address = new int[n];
         int[] objNumber = new int[n];
         bool ok = true;
         for (int k = 0; k < n; ++k) {
             ok = tokens.NextToken();
             if (!ok)
                 break;
             if (tokens.TokenType != PRTokeniser.TokType.NUMBER) {
                 ok = false;
                 break;
             }
             objNumber[k] = tokens.IntValue;
             ok = tokens.NextToken();
             if (!ok)
                 break;
             if (tokens.TokenType != PRTokeniser.TokType.NUMBER) {
                 ok = false;
                 break;
             }
             address[k] = tokens.IntValue + first;
         }
         if (!ok)
             throw new InvalidPdfException(MessageLocalization.GetComposedMessage("error.reading.objstm"));
         for (int k = 0; k < n; ++k) {
             if (map.ContainsKey(k)) {
                 tokens.Seek(address[k]);
                 tokens.NextToken();
                 PdfObject obj;
                 if (tokens.TokenType == PRTokeniser.TokType.NUMBER) {
             	    obj = new PdfNumber(tokens.StringValue);
                 }
                 else {
             	    tokens.Seek(address[k]);
             	    obj = ReadPRObject();
                 }
                 xrefObj[objNumber[k]] = obj;
             }
         }            
     }
     finally {
         tokens = saveTokens;
     }
 }
Beispiel #34
0
 internal ByteStore(PRStream str, Dictionary<RefKey, int> serialized)
 {
     ByteBuffer bb = new ByteBuffer();
     int level = 100;
     SerObject(str, level, bb, serialized);
     this.b = bb.ToByteArray();
     hash = CalculateHash(this.b);
 }
Beispiel #35
0
        virtual protected internal PdfObject ReadPRObject() {
            tokens.NextValidToken();
            PRTokeniser.TokType type = tokens.TokenType;
            switch (type) {
                case PRTokeniser.TokType.START_DIC: {
                    ++readDepth;
                    PdfDictionary dic = ReadDictionary();
                    --readDepth;
					long pos = tokens.FilePointer;
                    // be careful in the trailer. May not be a "next" token.
                    bool hasNext;
                    do {
                        hasNext = tokens.NextToken();
                    } while (hasNext && tokens.TokenType == PRTokeniser.TokType.COMMENT);

                    if (hasNext && tokens.StringValue.Equals("stream")) {
                        //skip whitespaces
                        int ch;
                        do {
                            ch = tokens.Read();                        
                        } while (ch == 32 || ch == 9 || ch == 0 || ch == 12);
                        if (ch != '\n')
                            ch = tokens.Read();
                        if (ch != '\n')
                            tokens.BackOnePosition(ch);
                        PRStream stream = new PRStream(this, tokens.FilePointer);
                        stream.Merge(dic);
                        stream.ObjNum = objNum;
                        stream.ObjGen = objGen;
                        return stream;
                    }
                    else {
                        tokens.Seek(pos);
                        return dic;
                    }
                }
                case PRTokeniser.TokType.START_ARRAY: {
                    ++readDepth;
                    PdfArray arr = ReadArray();
                    --readDepth;
                    return arr;
                }
                case PRTokeniser.TokType.NUMBER:
                    return new PdfNumber(tokens.StringValue);
                case PRTokeniser.TokType.STRING:
                    PdfString str = new PdfString(tokens.StringValue, null).SetHexWriting(tokens.IsHexString());
                    str.SetObjNum(objNum, objGen);
                    if (strings != null)
                        strings.Add(str);
                    return str;
                case PRTokeniser.TokType.NAME: {
                    PdfName cachedName;
                    PdfName.staticNames.TryGetValue(tokens.StringValue, out cachedName);
                    if (readDepth > 0 && cachedName != null) {
                        return cachedName;
                    } else {
                        // an indirect name (how odd...), or a non-standard one
                        return new PdfName(tokens.StringValue, false);
                    }
                }
                case PRTokeniser.TokType.REF:
                    int num = tokens.Reference;
                    PRIndirectReference refi = new PRIndirectReference(this, num, tokens.Generation);
                    return refi;
                case PRTokeniser.TokType.ENDOFFILE:
                    throw new IOException(MessageLocalization.GetComposedMessage("unexpected.end.of.file"));
                default:
                    String sv = tokens.StringValue;
                    if ("null".Equals(sv)) {
                        if (readDepth == 0) {
                            return new PdfNull();
                        } //else
                        return PdfNull.PDFNULL;
                    }
                    else if ("true".Equals(sv)) {
                        if (readDepth == 0) {
                            return new PdfBoolean( true );
                        } //else
                        return PdfBoolean.PDFTRUE;
                    }
                    else if ("false".Equals(sv)) {
                        if (readDepth == 0) {
                            return new PdfBoolean( false );
                        } //else
                        return PdfBoolean.PDFFALSE;
                    }
                    return new PdfLiteral(-(int)type, tokens.StringValue);
            }
        }
Beispiel #36
0
 public PRStream(PRStream stream, PdfDictionary newDic, PdfReader reader) : this(stream, newDic) {
     this.reader = reader;
 }
Beispiel #37
0
 protected internal PdfObject ReadOneObjStm(PRStream stream, int idx) {
     int first = stream.GetAsNumber(PdfName.FIRST).IntValue;
     byte[] b = GetStreamBytes(stream, tokens.File);
     PRTokeniser saveTokens = tokens;
     tokens = new PRTokeniser(b);
     try {
         int address = 0;
         bool ok = true;
         ++idx;
         for (int k = 0; k < idx; ++k) {
             ok = tokens.NextToken();
             if (!ok)
                 break;
             if (tokens.TokenType != PRTokeniser.TK_NUMBER) {
                 ok = false;
                 break;
             }
             ok = tokens.NextToken();
             if (!ok)
                 break;
             if (tokens.TokenType != PRTokeniser.TK_NUMBER) {
                 ok = false;
                 break;
             }
             address = tokens.IntValue + first;
         }
         if (!ok)
             throw new InvalidPdfException(MessageLocalization.GetComposedMessage("error.reading.objstm"));
         tokens.Seek(address);
         return ReadPRObject();
     }
     finally {
         tokens = saveTokens;
     }
 }
Beispiel #38
0
		virtual protected internal PdfObject ReadOneObjStm (PRStream stream, int idx) {
            int first = stream.GetAsNumber(PdfName.FIRST).IntValue;
            byte[] b = GetStreamBytes(stream, tokens.File);
            PRTokeniser saveTokens = tokens;
            tokens = new PRTokeniser(new RandomAccessFileOrArray(new RandomAccessSourceFactory().CreateSource(b)));
            try {
				int address = 0;
                bool ok = true;
                ++idx;
                for (int k = 0; k < idx; ++k) {
                    ok = tokens.NextToken();
                    if (!ok)
                        break;
                    if (tokens.TokenType != PRTokeniser.TokType.NUMBER) {
                        ok = false;
                        break;
                    }
                    ok = tokens.NextToken();
                    if (!ok)
                        break;
                    if (tokens.TokenType != PRTokeniser.TokType.NUMBER) {
                        ok = false;
                        break;
                    }
                    address = tokens.IntValue + first;
                }
                if (!ok)
                    throw new InvalidPdfException(MessageLocalization.GetComposedMessage("error.reading.objstm"));
                tokens.Seek(address);
                tokens.NextToken();
                PdfObject obj;
                if (tokens.TokenType == PRTokeniser.TokType.NUMBER) {
                    obj = new PdfNumber(tokens.StringValue);
                }
                else {
                    tokens.Seek(address);
                    obj = ReadPRObject();
                }
                return obj;
            }
            finally {
                tokens = saveTokens;
            }
        }
Beispiel #39
0
        private void CheckPRStreamLength(PRStream stream) {
            long fileLength = tokens.Length;
			long start = stream.Offset;
            bool calc = false;
			long streamLength = 0;
            PdfObject obj = GetPdfObjectRelease(stream.Get(PdfName.LENGTH));
            if (obj != null && obj.Type == PdfObject.NUMBER) {
                streamLength = ((PdfNumber)obj).IntValue;
                if (streamLength + start > fileLength - 20)
                    calc = true;
                else {
                    tokens.Seek(start + streamLength);
                    String line = tokens.ReadString(20);
                    if (!line.StartsWith("\nendstream") &&
                    !line.StartsWith("\r\nendstream") &&
                    !line.StartsWith("\rendstream") &&
                    !line.StartsWith("endstream"))
                        calc = true;
                }
            }
            else
                calc = true;
            if (calc) {
                byte[] tline = new byte[16];
                tokens.Seek(start);
                long pos;
                while (true) {
                    pos = tokens.FilePointer;
                    if (!tokens.ReadLineSegment(tline, false)) // added boolean because of mailing list issue (17 Feb. 2014)
                        break;
                    if (Equalsn(tline, endstream)) {
                        streamLength = pos - start;
                        break;
                    }
                    if (Equalsn(tline, endobj)) {
                        tokens.Seek(pos - 16);
                        String s = tokens.ReadString(16);
                        int index = s.IndexOf("endstream");
                        if (index >= 0)
                            pos = pos - 16 + index;
                        streamLength = pos - start;
                        break;
                    }
                }
                tokens.Seek(pos - 2);
                if(tokens.Read() == 13)
                    streamLength--;
                tokens.Seek(pos - 1);
                if(tokens.Read() == 10)
                    streamLength--;
            }
            stream.Length = (int)streamLength;
        }
Beispiel #40
0
 public PRStream(PRStream stream, PdfDictionary newDic, PdfReader reader) : this(stream, newDic)
 {
     this.reader = reader;
 }
Beispiel #41
0
 protected internal void ReadObjStm(PRStream stream, IntHashtable map) {
     int first = stream.GetAsNumber(PdfName.FIRST).IntValue;
     int n = stream.GetAsNumber(PdfName.N).IntValue;
     byte[] b = GetStreamBytes(stream, tokens.File);
     PRTokeniser saveTokens = tokens;
     tokens = new PRTokeniser(b);
     try {
         int[] address = new int[n];
         int[] objNumber = new int[n];
         bool ok = true;
         for (int k = 0; k < n; ++k) {
             ok = tokens.NextToken();
             if (!ok)
                 break;
             if (tokens.TokenType != PRTokeniser.TK_NUMBER) {
                 ok = false;
                 break;
             }
             objNumber[k] = tokens.IntValue;
             ok = tokens.NextToken();
             if (!ok)
                 break;
             if (tokens.TokenType != PRTokeniser.TK_NUMBER) {
                 ok = false;
                 break;
             }
             address[k] = tokens.IntValue + first;
         }
         if (!ok)
             throw new InvalidPdfException("Error reading ObjStm");
         for (int k = 0; k < n; ++k) {
             if (map.ContainsKey(k)) {
                 tokens.Seek(address[k]);
                 PdfObject obj = ReadPRObject();
                 xrefObj[objNumber[k]] = obj;
             }
         }            
     }
     finally {
         tokens = saveTokens;
     }
 }