Пример #1
0
        /// <summary>
        /// Creates a new instance of the PdfDocument class from the IO stream.
        /// </summary>
        /// <param name="stream">The <see cref="Stream"/> on which to open the PdfDocument.</param>
        /// <returns></returns>
        public static PdfDocument Open(Stream stream)
        {
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }

            if (!stream.CanRead)
            {
                throw new ArgumentException("Cannot read stream", nameof(stream));
            }

            var document = new PdfDocument(stream);

            using (var reader = new PdfReader(stream))
            {
                // Check header
                document.pdfVersion = PdfVersion.FromReader(reader);

                // Check trailer
                reader.Position = reader.GetXRefPosition();

                // Read Cross-Reference Table
                IPdfTrailer  trailer;
                IXRefSection xrefSection;
                char         fisrtChar;

                do
                {
                    fisrtChar = reader.Peek();
                    if (fisrtChar == XRefSection.StartKeyword[0])
                    {
                        // Cross-Reference Section
                        xrefSection = XRefSection.FromReader(reader);
                        trailer     = PdfTrailer.FromReader(reader);
                    }
                    else if (char.IsDigit(fisrtChar))
                    {
                        // Cross-Reference Stream
                        var xrefStream = XRefStream.FromReader(reader);
                        trailer     = xrefStream;
                        xrefSection = xrefStream;
                    }
                    else
                    {
                        throw new FormatException("Invalid Cross-Reference section.");
                    }

                    if (document.xrefTable == null)
                    {
                        // Initialize document's Cross-Reference Table
                        document.xrefTable = new XRefTable(xrefSection, trailer.Size);
                    }
                    else
                    {
                        // Register section
                        document.xrefTable.AddSection(xrefSection);
                    }

                    // Keep instance of last trailer
                    if (document.trailer == null)
                    {
                        document.trailer = trailer;
                    }

                    // Seek to previous trailer
                    if (trailer.Prev.HasValue)
                    {
                        reader.Position = trailer.Prev.Value;
                    }
                }while (trailer.Prev != null);
            }

            return(document);
        }