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)); }
public Type0FontHandler(CidFontFactory cidFontFactory, CMapCache cMapCache, IFilterProvider filterProvider, IPdfObjectParser pdfObjectParser) { this.cidFontFactory = cidFontFactory; this.cMapCache = cMapCache; this.filterProvider = filterProvider; this.pdfObjectParser = pdfObjectParser; }
public PageFactory(IResourceStore resourceStore, IPdfObjectParser pdfObjectParser, IFilterProvider filterProvider, IPageContentParser pageContentParser) { this.resourceStore = resourceStore; this.pdfObjectParser = pdfObjectParser; this.filterProvider = filterProvider; this.pageContentParser = pageContentParser; }
public CidFontFactory(FontDescriptorFactory descriptorFactory, TrueTypeFontParser trueTypeFontParser, IPdfObjectParser pdfObjectParser, IFilterProvider filterProvider) { this.descriptorFactory = descriptorFactory; this.trueTypeFontParser = trueTypeFontParser; this.pdfObjectParser = pdfObjectParser; this.filterProvider = filterProvider; }
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; }
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); }
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; }
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}."); }
public ResourceContainer(IPdfObjectParser pdfObjectParser, IFontFactory fontFactory) { this.pdfObjectParser = pdfObjectParser; this.fontFactory = fontFactory; }
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); }
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}"); }
public CatalogFactory(IPdfObjectParser pdfObjectParser) { this.pdfObjectParser = pdfObjectParser; }