Beispiel #1
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);
        }
        /**
         * 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 #3
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 #4
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 #5
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 #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);
         parentObjects[value] = inp;
         PdfObject res = CopyObject(value);
         if ((res != null) && !(res is PdfNull))
             outp.Put(key, res);
     }
     
     return outp;
 }
Beispiel #7
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;
 }
        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 #9
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;
 }