Exemple #1
0
        public void ReadsEmptySection()
        {
            // Arrange
            XRefSection section;

            using (var pdfStream = new MemoryStream())
            {
                using (var sw = new StreamWriter(pdfStream, Encoding.ASCII, 128, true))
                {
                    sw.WriteLine("xref");
                    sw.WriteLine("0 0");
                    sw.WriteLine("trailer");
                }

                pdfStream.Seek(0, SeekOrigin.Begin);

                // Act
                using (var reader = new PdfReader(pdfStream))
                {
                    section = XRefSection.FromReader(reader);
                }
            }

            // Assert
            Assert.NotNull(section);
            Assert.NotNull(section.Entries);
            Assert.Equal(0, section.Entries.Count);
        }
Exemple #2
0
        public void ReadsSimpleSection()
        {
            // Arrange
            XRefSection section;

            using (var pdfStream = new MemoryStream())
            {
                using (var sw = new StreamWriter(pdfStream, Encoding.ASCII, 128, true))
                {
                    sw.WriteLine("xref");
                    sw.WriteLine("0 6");
                    sw.Write("0000000003 65535 f\r\n");
                    sw.Write("0000000017 00000 n\r\n");
                    sw.Write("0000000081 00000 n\r\n");
                    sw.Write("0000000000 00007 f\r\n");
                    sw.Write("0000000331 00000 n\r\n");
                    sw.Write("0000000409 00000 n\r\n");
                    sw.WriteLine("trailer");
                }

                pdfStream.Seek(0, SeekOrigin.Begin);

                // Act
                using (var reader = new PdfReader(pdfStream))
                {
                    section = XRefSection.FromReader(reader);
                }
            }

            // Assert
            Assert.NotNull(section);
            Assert.NotNull(section.Entries);
            Assert.Equal(6, section.Entries.Count);

            Assert.Equal(PdfObjectId.Zero, section.Entries[0].ObjectId);
            Assert.Equal(3, (section.Entries[0] as PdfFreeObjectReference).NextFreeObjectNumber);

            Assert.Equal(new PdfObjectId(1), section.Entries[1].ObjectId);
            Assert.Equal(17, (section.Entries[1] as PdfObjectReference).Position);

            Assert.Equal(new PdfObjectId(2), section.Entries[2].ObjectId);
            Assert.Equal(81, (section.Entries[2] as PdfObjectReference).Position);

            Assert.Equal(new PdfObjectId(3, 7), section.Entries[3].ObjectId);
            Assert.Equal(0, (section.Entries[3] as PdfFreeObjectReference).NextFreeObjectNumber);

            Assert.Equal(new PdfObjectId(4), section.Entries[4].ObjectId);
            Assert.Equal(331, (section.Entries[4] as PdfObjectReference).Position);

            Assert.Equal(new PdfObjectId(5), section.Entries[5].ObjectId);
            Assert.Equal(409, (section.Entries[5] as PdfObjectReference).Position);
        }
Exemple #3
0
        public void ReadsSubSections()
        {
            // Arrange
            XRefSection section;

            using (var pdfStream = new MemoryStream())
            {
                using (var sw = new StreamWriter(pdfStream, Encoding.ASCII, 128, true))
                {
                    sw.WriteLine("xref");
                    sw.WriteLine("0 1");
                    sw.Write("0000000000 65535 f\r\n");
                    sw.WriteLine("3 1");
                    sw.Write("0000025325 00000 n\r\n");
                    sw.WriteLine("23 2");
                    sw.Write("0000025518 00002 n\r\n");
                    sw.Write("0000025635 00000 n\r\n");
                    sw.WriteLine("30 1");
                    sw.Write("0000025777 00000 n\r\n");
                    sw.WriteLine("trailer");
                }

                pdfStream.Seek(0, SeekOrigin.Begin);

                // Act
                using (var reader = new PdfReader(pdfStream))
                {
                    section = XRefSection.FromReader(reader);
                }
            }

            // Assert
            Assert.NotNull(section);
            Assert.NotNull(section.Entries);
            Assert.Equal(5, section.Entries.Count);

            Assert.Equal(PdfObjectId.Zero, section.Entries[0].ObjectId);
            Assert.Equal(0, (section.Entries[0] as PdfFreeObjectReference).NextFreeObjectNumber);

            Assert.Equal(new PdfObjectId(3), section.Entries[3].ObjectId);
            Assert.Equal(25325, (section.Entries[3] as PdfObjectReference).Position);

            Assert.Equal(new PdfObjectId(23, 2), section.Entries[23].ObjectId);
            Assert.Equal(25518, (section.Entries[23] as PdfObjectReference).Position);

            Assert.Equal(new PdfObjectId(24), section.Entries[24].ObjectId);
            Assert.Equal(25635, (section.Entries[24] as PdfObjectReference).Position);

            Assert.Equal(new PdfObjectId(30), section.Entries[30].ObjectId);
            Assert.Equal(25777, (section.Entries[30] as PdfObjectReference).Position);
        }
Exemple #4
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);
        }