Ejemplo n.º 1
0
        public DocumentInformation Create(IPdfObjectParser pdfObjectParser,
                                          PdfDictionary rootDictionary, IRandomAccessRead reader,
                                          bool isLenientParsing)
        {
            if (!rootDictionary.TryGetItemOfType(CosName.INFO, out CosObject infoBase))
            {
                return(DocumentInformation.Default);
            }

            var infoParsed = pdfObjectParser.Parse(infoBase.ToIndirectReference(), reader, isLenientParsing);

            if (!(infoParsed is PdfDictionary infoDictionary))
            {
                return(DocumentInformation.Default);
            }

            var title    = GetEntryOrDefault(infoDictionary, CosName.TITLE);
            var author   = GetEntryOrDefault(infoDictionary, CosName.AUTHOR);
            var subject  = GetEntryOrDefault(infoDictionary, CosName.SUBJECT);
            var keywords = GetEntryOrDefault(infoDictionary, CosName.KEYWORDS);
            var creator  = GetEntryOrDefault(infoDictionary, CosName.CREATOR);
            var producer = GetEntryOrDefault(infoDictionary, CosName.PRODUCER);

            return(new DocumentInformation(title, author, subject,
                                           keywords, creator, producer));
        }
Ejemplo n.º 2
0
 public Type0FontHandler(CidFontFactory cidFontFactory, CMapCache cMapCache, IFilterProvider filterProvider, IPdfObjectParser pdfObjectParser)
 {
     this.cidFontFactory  = cidFontFactory;
     this.cMapCache       = cMapCache;
     this.filterProvider  = filterProvider;
     this.pdfObjectParser = pdfObjectParser;
 }
Ejemplo n.º 3
0
 public PageFactory(IResourceStore resourceStore, IPdfObjectParser pdfObjectParser, IFilterProvider filterProvider,
                    IPageContentParser pageContentParser)
 {
     this.resourceStore     = resourceStore;
     this.pdfObjectParser   = pdfObjectParser;
     this.filterProvider    = filterProvider;
     this.pageContentParser = pageContentParser;
 }
Ejemplo n.º 4
0
 public CidFontFactory(FontDescriptorFactory descriptorFactory, TrueTypeFontParser trueTypeFontParser,
                       IPdfObjectParser pdfObjectParser,
                       IFilterProvider filterProvider)
 {
     this.descriptorFactory  = descriptorFactory;
     this.trueTypeFontParser = trueTypeFontParser;
     this.pdfObjectParser    = pdfObjectParser;
     this.filterProvider     = filterProvider;
 }
Ejemplo n.º 5
0
 public TrueTypeFontHandler(IPdfObjectParser pdfObjectParser, IFilterProvider filterProvider,
                            CMapCache cMapCache,
                            FontDescriptorFactory fontDescriptorFactory,
                            TrueTypeFontParser trueTypeFontParser)
 {
     this.pdfObjectParser       = pdfObjectParser;
     this.filterProvider        = filterProvider;
     this.cMapCache             = cMapCache;
     this.fontDescriptorFactory = fontDescriptorFactory;
     this.trueTypeFontParser    = trueTypeFontParser;
 }
Ejemplo n.º 6
0
 internal PdfDocument(ILog log, IRandomAccessRead reader, HeaderVersion version, CrossReferenceTable crossReferenceTable,
                      bool isLenientParsing,
                      ParsingCachingProviders cachingProviders,
                      IPageFactory pageFactory,
                      IPdfObjectParser pdfObjectParser,
                      Catalog catalog,
                      DocumentInformation information)
 {
     this.log                 = log;
     this.reader              = reader ?? throw new ArgumentNullException(nameof(reader));
     this.version             = version ?? throw new ArgumentNullException(nameof(version));
     this.crossReferenceTable = crossReferenceTable ?? throw new ArgumentNullException(nameof(crossReferenceTable));
     this.isLenientParsing    = isLenientParsing;
     this.cachingProviders    = cachingProviders ?? throw new ArgumentNullException(nameof(cachingProviders));
     Information              = information ?? throw new ArgumentNullException(nameof(information));
     Catalog = catalog ?? throw new ArgumentNullException(nameof(catalog));
     Pages   = new Pages(log, Catalog, pdfObjectParser, pageFactory, reader, isLenientParsing);
 }
Ejemplo n.º 7
0
        internal Pages(ILog log, Catalog catalog, IPdfObjectParser pdfObjectParser, IPageFactory pageFactory,
                       IRandomAccessRead reader, bool isLenientParsing)
        {
            if (catalog == null)
            {
                throw new ArgumentNullException(nameof(catalog));
            }

            rootPageDictionary = catalog.PagesDictionary;

            Count = rootPageDictionary.GetIntOrDefault(CosName.COUNT);

            this.log              = log;
            this.catalog          = catalog;
            this.pdfObjectParser  = pdfObjectParser;
            this.pageFactory      = pageFactory;
            this.reader           = reader;
            this.isLenientParsing = isLenientParsing;
        }
Ejemplo n.º 8
0
        public static CosBase Find <T>(CosObject baseObject, IPdfObjectParser parser, IRandomAccessRead reader,
                                       bool isLenientParsing) where T : CosBase
        {
            var result = parser.Parse(baseObject.ToIndirectReference(), reader, isLenientParsing);

            if (result is T resultT)
            {
                return(resultT);
            }

            if (result is CosObject obj)
            {
                return(Find <T>(obj, parser, reader, isLenientParsing));
            }

            if (result is COSArray arr && arr.Count == 1 && arr.get(0) is CosObject arrayObject)
            {
                return(Find <T>(arrayObject, parser, reader, isLenientParsing));
            }

            throw new InvalidOperationException($"Could not find the object {baseObject.ToIndirectReference()} with type {typeof(T).Name}.");
        }
Ejemplo n.º 9
0
 public ResourceContainer(IPdfObjectParser pdfObjectParser, IFontFactory fontFactory)
 {
     this.pdfObjectParser = pdfObjectParser;
     this.fontFactory     = fontFactory;
 }
Ejemplo n.º 10
0
        public PdfRawStream Parse(IRandomAccessRead reader, PdfDictionary streamDictionary, bool isLenientParsing, IPdfObjectParser parser)
        {
            PdfRawStream result;

            // read 'stream'; this was already tested in parseObjectsDynamically()
            ReadHelper.ReadExpectedString(reader, "stream");

            skipWhiteSpaces(reader);

            // This needs to be streamDictionary.getItem because when we are parsing, the underlying object might still be null.
            ICosNumber streamLength = GetLength(reader, streamDictionary.GetItemOrDefault(CosName.LENGTH), streamDictionary.GetName(CosName.TYPE), isLenientParsing, parser);

            ValidateStreamLength(reader, isLenientParsing, streamLength);

            // get output stream to copy data to
            using (var stream = new MemoryStream())
                using (var writer = new BinaryWriter(stream))
                {
                    if (streamLength != null && validateStreamLength(reader, streamLength.AsLong(), reader.Length()))
                    {
                        ReadValidStream(reader, writer, streamLength);
                    }
                    else
                    {
                        ReadUntilEndStream(reader, writer);
                    }

                    result = new PdfRawStream(stream.ToArray(), streamDictionary);
                }

            String endStream = ReadHelper.ReadString(reader);

            if (endStream.Equals("endobj") && isLenientParsing)
            {
                log.Warn($"stream ends with \'endobj\' instead of \'endstream\' at offset {reader.GetPosition()}");

                // avoid follow-up warning about missing endobj
                reader.Rewind("endobj".Length);
            }
            else if (endStream.Length > 9 && isLenientParsing && endStream.Substring(0, 9).Equals("endstream"))
            {
                log.Warn("stream ends with '" + endStream + "' instead of 'endstream' at offset " + reader.GetPosition());
                // unread the "extra" bytes
                reader.Rewind(OtherEncodings.StringAsLatin1Bytes(endStream.Substring(9)).Length);
            }
            else if (!endStream.Equals("endstream"))
            {
                throw new InvalidOperationException("Error reading stream, expected='endstream' actual='"
                                                    + endStream + "' at offset " + reader.GetPosition());
            }

            return(result);
        }
Ejemplo n.º 11
0
        private ICosNumber GetLength(IRandomAccessRead source, CosBase lengthBaseObj, CosName streamType, bool isLenientParsing, IPdfObjectParser parser)
        {
            if (lengthBaseObj == null)
            {
                return(null);
            }

            // Length is given directly in the stream dictionary
            if (lengthBaseObj is ICosNumber number)
            {
                return(number);
            }

            // length in referenced object
            if (lengthBaseObj is CosObject lengthObj)
            {
                var currentObject = lengthObj.GetObject();

                if (currentObject == null)
                {
                    if (parser == null)
                    {
                        throw new InvalidOperationException("This method required access to the PDF object parser but it was not created yet. Figure out how to fix this.");
                    }

                    var currentOffset = source.GetPosition();

                    var obj = parser.Parse(lengthObj.ToIndirectReference(), source, isLenientParsing);

                    source.Seek(currentOffset);

                    if (obj is ICosNumber referenceNumber)
                    {
                        return(referenceNumber);
                    }

                    throw new InvalidOperationException("Length object content was not read.");
                }

                if (currentObject is ICosNumber objectNumber)
                {
                    return(objectNumber);
                }


                throw new InvalidOperationException("Wrong type of referenced length object " + lengthObj
                                                    + ": " + lengthObj.GetObject().GetType().Name);
            }

            throw new InvalidOperationException($"Wrong type of length object: {lengthBaseObj.GetType().Name}");
        }
Ejemplo n.º 12
0
 public CatalogFactory(IPdfObjectParser pdfObjectParser)
 {
     this.pdfObjectParser = pdfObjectParser;
 }