public ParsingArguments(IRandomAccessRead reader, CrossReferenceTable crossReferenceTable, ParsingCachingProviders cachingProviders, IContainer container, bool isLenientParsing) { Reader = reader ?? throw new ArgumentNullException(nameof(reader)); CrossReferenceTable = crossReferenceTable ?? throw new ArgumentNullException(nameof(crossReferenceTable)); CachingProviders = cachingProviders ?? throw new ArgumentNullException(nameof(cachingProviders)); Container = container ?? throw new ArgumentNullException(nameof(container)); IsLenientParsing = isLenientParsing; Log = new NoOpLog(); }
private static PdfDocument OpenDocument(IRandomAccessRead reader, IInputBytes inputBytes, ISeekableTokenScanner scanner, IContainer container, bool isLenientParsing) { var log = container.Get <ILog>(); var version = container.Get <FileHeaderParser>().Parse(scanner, isLenientParsing); var crossReferenceOffset = container.Get <FileTrailerParser>().GetFirstCrossReferenceOffset(inputBytes, scanner, isLenientParsing); var pool = new CosObjectPool(); // TODO: make this use the scanner. var validator = new CrossReferenceOffsetValidator(new XrefOffsetValidator(log, reader, container.Get <CosDictionaryParser>(), container.Get <CosBaseParser>(), pool)); crossReferenceOffset = validator.Validate(crossReferenceOffset, isLenientParsing); var crossReferenceTable = container.Get <CrossReferenceParser>() .Parse(reader, isLenientParsing, crossReferenceOffset, pool); container.Get <CrossReferenceParser>().ParseNew(crossReferenceOffset, scanner, isLenientParsing); var filterProvider = container.Get <IFilterProvider>(); var bruteForceSearcher = new BruteForceSearcher(reader); var pdfObjectParser = new PdfObjectParser(container.Get <ILog>(), container.Get <CosBaseParser>(), container.Get <CosStreamParser>(), crossReferenceTable, bruteForceSearcher, pool, container.Get <ObjectStreamParser>()); var trueTypeFontParser = new TrueTypeFontParser(); var fontDescriptorFactory = new FontDescriptorFactory(); var cidFontFactory = new CidFontFactory(fontDescriptorFactory, trueTypeFontParser, pdfObjectParser, filterProvider); var cMapCache = new CMapCache(new CMapParser()); var fontFactory = new FontFactory(log, new Type0FontHandler(cidFontFactory, cMapCache, filterProvider, pdfObjectParser), new TrueTypeFontHandler(pdfObjectParser, filterProvider, cMapCache, fontDescriptorFactory, trueTypeFontParser)); var dynamicParser = container.Get <DynamicParser>(); var resourceContainer = new ResourceContainer(pdfObjectParser, fontFactory); var pageFactory = new PageFactory(resourceContainer, pdfObjectParser, filterProvider, new PageContentParser(new ReflectionGraphicsStateOperationFactory())); var informationFactory = new DocumentInformationFactory(); var catalogFactory = new CatalogFactory(pdfObjectParser); var root = ParseTrailer(reader, crossReferenceTable, dynamicParser, bruteForceSearcher, pool, isLenientParsing); if (!(root is PdfDictionary rootDictionary)) { throw new InvalidOperationException("Expected root dictionary, but got this: " + root); } // in some pdfs the type value "Catalog" is missing in the root object if (isLenientParsing && !rootDictionary.ContainsKey(CosName.TYPE)) { rootDictionary.Set(CosName.TYPE, CosName.CATALOG); } var information = informationFactory.Create(pdfObjectParser, crossReferenceTable.Dictionary, reader, isLenientParsing); var catalog = catalogFactory.Create(rootDictionary, reader, isLenientParsing); var caching = new ParsingCachingProviders(pool, bruteForceSearcher, resourceContainer); return(new PdfDocument(log, reader, version, crossReferenceTable, isLenientParsing, caching, pageFactory, pdfObjectParser, catalog, information)); }